Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Workshop 1:

Workshop 1:

作者头像
葆宁
发布于 2019-06-15 08:30:49
发布于 2019-06-15 08:30:49
73700
代码可运行
举报
文章被收录于专栏:FREE SOLOFREE SOLO
运行总次数:0
代码可运行

Workshop 1:

Workshop1涉及到的主题: 二进制 十六进制 “与”操作 1:二进制数学 作为了解网络是如何工作的,你需要对二进制算法有很好的理解。这是为什么呢? 因为网络设备所呈现出来的一些操作是通过二进制算法来完成的,比如一下应用就会使用到二进制数学的知识: 解析网络首部字段 使用计算机的子网掩码 确定一个分组是否应当被转发给目的IP地址 所以,让我们来了解基本的二进制算法,然后做一些练习。 1.1 引言 任何数字都可以通过无限多的方式表示出来,而不需要改变数字本身。比如,一打鸡蛋的数量总是相同的(12个)。然而,将数字写在纸上的方式可以有很多种。比如,鸡蛋的数目是: 一打(汉语) 12(十进制数) XII(罗马数字) 1100(二进制) 上述所表达的都是同一个数字。我们之所以在计算机中非常频繁的使用二进制来表达数字,这是由计算机存储和处理数字的方式所决定的。. 二进制表示法和十进制表示法有一些相似之处 数的十进制表示 数的二进制表示 最右边的列是有意义的 最右边的列是有意义的 每一列的值是其右边列的值的10倍 每一列的值是其右边列的值的2倍 有固定数目的标识符: 0,1,2,3,4,5,6,7,8,9. 有固定数目的标识符: 0,1. 0代表这一列没有值。最前面的0是可选的 0代表这一列没有值。最前面的0是可选的 1.2 二进制表示法 基于上面的介绍,现在我们可以看到,为了计算出一个二进制数的值,就像在十进制中所做的一样,我们只需要将列的值相加即可。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  1
  2 6 3 1
  8 4 2 6  8 4 2 1
  ----------------
  0 1 1 0  1 0 1 1<-- 二进制数字

请注意,我已经在数字上方标示出了每一列的值。数字01101011是一个普通的数字,它只是恰巧用二进制的方式表达了出来。如果我们想将它转换成十进制,我们只需将各列的值相加即可:

01101011 in binary = 64 + 32 + 8 + 2 + 1 = 107 (十进制)

你应当至少熟悉下面的8列数值,并且你应当注意到每一个值都是2的若干次幂:

2^0 = 1 2^1 = 2 2^2 = 4 2^3 = 8 2^4 = 16 2^5 = 32 2^6 = 64 2^7 = 128 2^8 = 256 2^9 = 512 2^10 = 1024 2^11 = 2048 2^12 = 4096 等等.

你还需要牢记的是一个所有位都是二进制1的八位位组(即一个包含8比特位的位组)等价于十进制的255,也就是 1111 1111(二进制) = 255(十进制) 1.3 将十进制转换为二进制 最简单的方法是用十进制数减去适当的2的若干次幂,直到结果为零时停止,然后计算出哪一列需要标识1,而哪一列没有使用到,用0对其进行标记。比如,将217转换成二进制:

不能够减去256(这个数字太大了),因此可以减去128: 217 - 128 = 89 89 - 64 = 25 25 - 16 = 9 9 - 8 = 1 1 - 1 = 0

所使用到的2的幂有: 128 + 64 + 16 + 8 + 1

故所表示的二进制数是: 1101 1001

通常,我们会在四个比特位组之间增加一个空格,来增加可读性。 1.4 用二进制计数 你或许经常需要用二进制来计数。

下列常用计数应该熟记:

0000 0000= 0 0000 0001= 1 0000 0010= 2 0000 0011= 3 0000 0100= 4 0000 0101= 5 0000 0110= 6 0000 0111= 7 0000 1000= 8 0000 1001= 9 0000 1010= 10 0000 1011= 11 0000 1100= 12 0000 1101= 13 0000 1110= 14 0000 1111= 15 等等.

1.5 二进制练习 在下面的表格中,将左列中的二进制数转换为十进制数,然后将右边的十进制数转换为二进制数。 Binary Decimal 0001 1011 27 0101 0110 86 1001 1110 158 0010 0011 35 1101 0100 212 0001 1011 27 1100 1110 206 1011 1111 191 0101 1000 88 1.6 IP地址: 点分十进制和点分二进制表示法 继续深入今天的主题,我们会看到所有连接到Internet上的计算机都有一个以数字表示的地址,称为网络地址或IP地址。这些网络地址的长度是32位(bit)。为了能够很容易的阅读这些地址,人们将整个地址划分为4个字节(每个字节8位),中间用圆点分割。 如果数字使用十进制表示的,我们称这种表示法为“点分十进制表示法”, 如果数字使用二进制表示的,我们称这种表示法为“点分二进制表示法” 要注意的是,十进制数字绝不能超过255.你能够解释为什么吗? 在有些场合,我们不得不将二进制表示的IP地址转换成十进制表示的IP地址,或者反过来做。这里有一些用点分法表示IP地址的例子。对于用“点分十进制表示法”的地址,请将其转换为“点分二进制表示法”的地址。反之亦然。 十进制IP地址 二进制IP地址 10.12.3.45 0000 1010 . 0000 1100 . 0000 0011 . 0010 1101 131.236.21.1 1000 0011 . 1110 1100 . 0001 0101 . 0000 0001 212.95.255.255 1101 0100 . 0101 1111 . 1111 1111 . 1111 1111 18.107.240.0 0001 0010 . 0110 1011 . 1111 0000 . 0000 0000 188.6.93.127 1011 1100 . 0000 0110 . 0101 1101 . 0111 1111 39.157.55.235 0010 0111 . 1001 1101 . 0011 0111 . 1110 1011 216.33.125.154 1101 1000 . 0010 0001 . 0111 1101 . 1001 1010 2:十六进制数学 因为计算机通常使用二进制,有些时候直接使用二进制会很方便,而不需要先将二进制转换成十进制,然后再将其转换回二进制。但是我们用肉眼去阅读二进制是非常困难的,所以早先的计算机开发者们想出来一个不同的表示法—“十六进制表示法”,这种表示法和二进制类似,但是对人们阅读会更容易。 简单的说,十六进制就是将二进制中的每个4比特位组转换成一个特殊的标识符。因为有4比特位,所以我们需要2^4=16个标识符;这也是它为什么叫做十六进制的原因。 Binary Hexadecimal Binary Hexadecimal 0000 0 1000 8 0001 1 1001 9 0010 2 1010 A 0011 3 1011 B 0100 4 1100 C 0101 5 1101 D 0110 6 1110 E 0111 7 1111 F 如果比特位多于4个,我们可以对它们进行4bit为一组的方式进行分组。比如以太网卡有一个内置的48位的标识,即MAC地址。如果将MAC地址用二进制表示出来,如下所示: 000000000000000011000000100011110101010111111000 然而如果对它们进行4位一组进行分组并进行转换的话,我们能够对上述地址用十六进制进行重写,这样阅读起来就非常容易了: 0000C08F55F8 事实上,以太网地址经常用冒号(“:”)或者减号(“-”)来帮助人们更加方便的阅读: 00:00:C0:8F:55:F8 2.1 十六进制练习 完成以下二进制和十六进制之间的转换 二进制 十六进制 00101101 2D 10110011 B3 11111000 F8 00011000 18 00100111 27 1011110100001111 BD0F 110000110000000010100110 C300A6 3: 使用“AND”屏蔽比特 当处理IP地址的时候,我们经常会从一个IP地址中分割出若干位,因为这若干位有着特定的意义:这个IP地址所在的网络地址。我们希望将非网络地址位设置为零。可以通过在地址的每一位上使用网络掩码(子网掩码)和AND操作来达到这个目的。 AND操作有这些属性: 0 AND 0 = 0 0 AND 1 = 0 1 AND 0 = 0 1 AND 1 = 1 可以看到,只有当AND左边的操作数和右边的操作数同时为1时结果才为1.更重要的是,从我们的角度来看,结果是这样的: X AND 0 总是 0 X AND 1 总是 X 通过复习上一个表格的内容可以验证我们的推测是正确的。现在,要看仔细了。我们有一个32位的IP地址,并且我们知道左手边的16位代表了这个IP地址的网络地址。我们想保留这16位网络地址,而将其他位填充为零。通过将IP地址和一个前16位都是1,后16位都是0的网络掩码进行AND操作,就可以达到我们的目的: IP地址 1010 0001 1111 1101 0001 0110 1001 0110 网络掩码 1111 1111 1111 1111 0000 0000 0000 0000 AND结果 1010 0001 1111 1101 0000 0000 0000 0000 可以看到,通过使用网络掩码和AND操作已经可以将我们不需要的位全部填充为零了。当然,我们可以通过用十六进制表示法来使书写更加简短: IP地址 A1FD 1696 网络掩码 FFFF 0000 AND结果 A1FD 0000 3.1 "AND"操作练习 应用下面练习中提供的网络掩码来计算出每个IP地址所属的网络地址 IP地址 0001 0010 0110 1011 1000 1110 1000 0001 网络掩码 1111 1111 1111 0000 0000 0000 0000 0000 AND结果 0001 0010 0110 0000 0000 0000 0000 0000 IP地址 0010 1110 0100 0000 1011 0001 0100 0111 网络掩码 1111 1111 1111 1111 1000 0000 0000 0000 AND结果 0010 1110 0100 0000 1000 0000 0000 0000 IP地址 83EC 0156 网络掩码 FF00 0000 AND结果 1000 0011 0000 0000 0000 0000 0000 0000

或者十六进制表示

8300 0000

IP地址 4743 724E 网络掩码 FFFF C000 AND结果 0100 0111 0100 0011 0000 0000 0000 0000

或者十六进制表示

4743 0000

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年06月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python:过滤字符串中的字母数字特殊
字符串.isalnum()  所有字符都是数字或者字母,为真返回 Ture,否则返回 False。 字符串.isalpha()   所有字符都是字母,为真返回 Ture,否则返回 False。 字符串.isdigit()     所有字符都是数字,为真返回 Ture,否则返回 False。 字符串.islower()    所有字符都是小写,为真返回 Ture,否则返回 False。 字符串.isupper()   所有字符都是大写,为真返回 Ture,否则返回 False。 字符串.istitle()      所有单词都是首字母大写,为真返回 Ture,否则返回 False。 字符串.isspace()   所有字符都是空白字符,为真返回 Ture,否则返回 False。
py3study
2020/01/19
3.9K0
Python:监控键盘输入、鼠标操作,并
  使用pyhook模块可以很快地完成键盘及鼠标事件捕获,本来想使用python的logging模块,但测试时发现,因为鼠标事件频率太高,导致写时报I/O错误的异常,所以使用了自己写文件记录日志的方式。
py3study
2020/01/06
2.1K0
ASCII码对照表
ASCII可显示字符 二进制 十进制 十六进制 图形 0010 0000 32 20 (空格)(␠) 0010 0001 33 21 ! 0010 0010 34 22 " 0010 0011 35 23 # 0010 0100 36 24 $ 0010 0101 37 25 % 0010 0110 38 26 & 0010 0111 39 27 ' 0010 1000 40 28 ( 0010 1001 41 29 ) 0010 1010 42 2A * 0010 1011 43 2B + 0010 11
kenvie
2022/01/20
1.6K0
C语言数据类型的定义
将各个位数的二进制用十进制中的【数字 】来表示多位的二进制数 通过【数字 】相加就可以得到二进制数的数据
以某
2023/03/07
1.4K0
ASCII码表_ASCII码对照表
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。 ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。其中: 0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符)如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。 65~90为26个大写英文字母, 97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
张旭博客
2022/12/27
2.1K0
ASCII对应码表(键值)
  记住几个常见字母的ASCII码大小: “A”为65;“a”为97;“0”为 48。
红目香薰
2022/11/29
4.3K0
ASS II 码对照表
ASCII(American Standard Code for Information Interchange)定义从 0 到 127 的共128个数字所代表的英文字母或一样的结果与意义。由于使用7个位(bit)就可以表示从0到127的数字,大部分的电脑都使用8个位来存取字元集 (character set),所以从128到255之间的数字可以用来代表另一组128个符号,称为extended ASCII。 目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(Amer
赵腰静
2018/03/09
3.8K0
密码学之ASCII编码(02)
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符
海拥
2021/08/23
1.1K0
C++ 数学与算法系列之认识格雷码
程序中所涉及到的任何数据,计算机底层均需转换成二进制数值后方可存储,这个过程也称为编码。反之,把底层二进制数据转换成应用数据称为解码,
一枚大果壳
2022/12/20
1.1K0
C++ 数学与算法系列之认识格雷码
原码、反码、补码详解
一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为 0,负数为 1。
马修
2021/01/21
1.1K0
ASCII控制字符
国际标准ISO/IEC 646 二进制 十进制 十六进制 缩写 可以显示的表示法 名称/意义 0000 0000 0 00 NUL ␀ 空字符(Null) 0000 0001 1 01 SOH ␁ 标题开始 0000 0010 2 02 STX ␂ 本文开始 0000 0011 3 03 ETX ␃ 本文结束 0000 0100 4 04 EOT ␄ 传输结束 0000 0101 5 05 ENQ ␅ 请求 0000 0110 6 06 ACK ␆ 确认回应 0000 0111 7 07 BEL ␇ 响铃
红目香薰
2022/11/29
6120
Ascii code_扩展ascii码表
ASCII码表是American Standard Code for Information Interchange 即美国标准信息交换代码 ASCII码表如下:
全栈程序员站长
2022/11/05
1.2K0
C语言关于进制转换,补码, 整数的位操作
一、进制转换  //关于进制转换,从网上找了几张经典图片,便于后面查询 1、二进制转十进制、八进制转十进制、十六进制转十进制 2、十进制转二进制, 十进制转八进制,十进制转十六进制 3、二进制转八进制
tandaxia
2018/09/27
5.2K0
C语言关于进制转换,补码, 整数的位操作
java使用md5_Java_MD5的使用「建议收藏」
3 importjava.nio.charset.Charset;4 importjava.security.MessageDigest;5
全栈程序员站长
2022/09/08
4200
「位运算」计算机基础复习
这两天有点闲,划水太严重。没有学习啥东西,跑去翻了一下书,看到 &, |, ^, ~, << ,>> 这些位运算。然后就想起来了计算机的 原码,反码 和 补码。感觉写了两年的前端,我好像早已把这些东西抛之脑后,对于位运算我好像也没用过。写这个算是给自己复习,记录一下吧。
拾贰
2019/08/22
5550
二进制和十六进制的转换操作
《Oracle中怎么导出索引数据块?》提到rowid的转换,先将十六进制,转成二进制,再转成十进制。
bisal
2022/05/12
1K0
【期末复习笔记】数字逻辑
因为:3可以由8、4、2、1中4个数字中的2和1相加获得,所以只需要在对应的2和1下面写入1即可,其余4位补0
德宏大魔王
2023/08/08
2670
【期末复习笔记】数字逻辑
计算机基础(4)——原码、补码、反码
计算机为了区分数值的正负提出了符号位的设定,计算机用最高位存放符号,这个被称为符号位。正数的符号位为0, 负数的符号位为1。
绿水长流z
2025/01/03
2320
计算机基础(4)——原码、补码、反码
Python进制转换
进制转换: 进制转换是人们利用符号来计数的方法。 进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。 基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。 位权是指,进位制中每一固定位置对应的单位值。 简单转换理念: 把二进制三位一组分开就是八进制, 四位一组就是十六进制 二进制与十进制: (1)二进制转十进制:“按权展开求和” (1011)2=1x2**3 + 0x2**2 + 1x2**1 + 1x2**0=(11)10 规律:个位上的数字的次数是0,十位上的数字的次
py3study
2020/01/06
1.1K0
进制介绍与转换
计算机是电子电荷集合的方式在内存中宝保存指令和数据,二进制数用两个数字作基础,其中每一个二进制数成为bit不是0就是1.位自右向左,从0开始顺序增加,左边的位称为最高有效位(Most Significant Bit MSB),右边的称为最低有效位(LSB least significant Bit).一个16位的二进制数 其MSB和LSB如下所示:
小柒吃地瓜
2020/04/23
1.7K0
相关推荐
python:过滤字符串中的字母数字特殊
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档