二进制转十进制
从右向左开始,从右边第一个数开始,依次乘以2的n次幂 ,n从0开始,每次递增1(0,1,2,3 。。。。)得出得数相加就是十进制得数
如:0101=1*2的0次幂+0*2的1次幂+1*2的2次幂+0*2的3次幂=5
十进制转二进制
除2取余法:将十进制数除以2,记录余数,然后将商继续除以2,直到商为0。将得到的余数从下到上排列(即最后得到的余数在最上面),即为该十进制数对应的二进制数。
将十进制数23转换为二进制:
- 23 ÷ 2 = 11 余 1
- 11 ÷ 2 = 5 余 1
- 5 ÷ 2 = 2 余 1
- 2 ÷ 2 = 1 余 0
- 1 ÷ 2 = 0 余 1
所以,23的二进制表示为
10111
。
八进制转十进制
在八进制数中,每一位的数值范围是0到7,而每一位的权重是8的幂次方,从右往左递增(最右边的位是8的0次方,然后是8的1次方,依此类推)。
如745 最右边是8的0次幂 中间是8的1次幂 左边是8的2次幂=5*1+4*8+7*64=485
十进制转八进制
除8取余法:与二进制转换类似,将十进制数除以8,记录余数,然后将商继续除以8,直到商为0。将得到的余数从下到上排列,即为该十进制数对应的八进制数。
将十进制数35转换为八进制:
- 35 ÷ 8 = 4 余 3
- 4 ÷ 8 = 0 余 4
所以,35的八进制表示为
43
。
十进制转十六进制
除16取余法:与二进制和八进制转换类似,将十进制数除以16,记录余数,然后将商继续除以16,直到商为0。但十六进制中,余数可能是10到15,这些值在十六进制中分别用A到F(或小写a到f)表示。将得到的余数(包括A-F)从下到上排列,即为该十进制数对应的十六进制数。
将十进制数255转换为十六进制:
- 255 ÷ 16 = 15 余 15(F)
- 15 ÷ 16 = 0 余 15(F)
所以,255的十六进制表示为
FF
。
十六进制转十进制
在十六进制数中,每一位的数值范围是0到F(其中F代表十进制中的15),而每一位的权重是16的幂次方,从右往左递增(最右边的位是16的0次方,然后是16的1次方,依此类推)。
如 1A3F1 最右边是16的0次幂 依次加一次幂=15*1+3*16+10*256+1*4096=6719
二进制转十六进制
-
分组:首先,将二进制数从右往左每4位分成一组(如果最左边不足4位,则前面补0)。
-
转换:将每一组的4位二进制数转换为对应的十六进制数。转换时,可以直接使用二进制到十六进制的映射表,或者使用二进制数的值来计算。
将二进制数
10101011010
转换为十六进制:
- 分组:
0101 1010 1010
(注意最左边补了两个0以达到4的倍数)- 转换:A 5 5
所以,
10101011010
的十六进制表示为A55
十六进制转二进制
-
拆分每一位:首先,将十六进制数的每一位(0-9或A-F)拆分开来。
-
转换每一位:然后,将每一位十六进制数转换为对应的4位二进制数。这可以通过查找十六进制到二进制的映射表来完成,或者使用简单的转换规则(例如,A=1010, B=1011, ..., F=1111)。
-
拼接结果:最后,将转换得到的所有二进制数按照原来的顺序拼接起来,形成最终的二进制数。
将十六进制数
1A3F
转换为二进制:
- 拆分:
1
A
3
F
- 转换:
0001
1010
0011
1111
- 拼接:
0001101000111111
所以,
1A3F
的二进制表示为0001101000111111
(注意,这里为了清晰展示了前导零,但在实际表示中,前导零通常可以省略)。
二进制转八进制
-
分组:与十六进制类似,但这次是每3位二进制数分成一组(如果最左边不足3位,则前面补0)
将二进制数
10101011010
转换为八进制:
- 分组:
010 101 011 010
(注意最左边补了两个0以达到3的倍数)- 转换:
2 5 3 2
所以,
10101011010
的八进制表示为2532
。
八进制转二进制
-
拆分每一位:与十六进制类似,将八进制数的每一位(0-7)拆分开来。
-
转换每一位:然后,将每一位八进制数转换为对应的3位二进制数。这可以通过查找八进制到二进制的映射表来完成,或者使用简单的转换规则(例如,1=001, 2=010, ..., 7=111)。
-
拼接结果:最后,将转换得到的所有二进制数按照原来的顺序拼接起来,形成最终的二进制数。
将八进制数
2532
转换为二进制:
- 拆分:
2
5
3
2
- 转换:
010
101
011
010
- 拼接:
10101011010
所以,
2532
的二进制表示为010101011010
(同样,前导零在实际表示中通常可以省略)。
位运算
位运算(Bitwise Operations)是在整数类型(通常是二进制表示)上直接进行操作的运算。这些操作直接对整数在内存中的二进制位(bit)进行,而不是对它们所表示的值进行操作。位运算符允许我们进行如位与(AND)、位或(OR)、位异或(XOR)、位非(NOT)、左移(Shift Left)和右移(Shift Right)等操作。
常见的位运算符
- 位与(AND):
&
- 对每一位执行逻辑与操作。只有两个比较位都为1时,结果位才为1。
- 示例:
5 & 3
(二进制:101 & 011
)结果为1
(二进制:001
)。- 位或(OR):
|
- 对每一位执行逻辑或操作。只要两个比较位中有一个为1,结果位就为1。
- 示例:
5 | 3
(二进制:101 | 011
)结果为7
(二进制:111
)。- 位异或(XOR):
^
- 对每一位执行逻辑异或操作。当两个比较位不相同时,结果位为1;相同时,结果位为0。
- 示例:
5 ^ 3
(二进制:101 ^ 011
)结果为6
(二进制:110
)。- 位非(NOT):
~
(注意:这通常是对整个数进行操作,而不是两个数)
- 对数的每一位执行逻辑非操作。0变为1,1变为0。
- 示例:
~5
(假设是8位二进制表示)结果为-6
(二进制:...11111010
,注意前面的位取决于数的表示范围,这里用省略号表示)。- 左移(Shift Left):
<<
- 将数的所有位向左移动指定的位数,右边超出的位被丢弃,左边超出的部分取决于数的符号(对于有符号整数)。(符号位不变,低位补0)
- 示例:
5 << 2
(二进制:101 << 2(10)
)结果为20
(二进制:10100
)。- 右移(Shift Right):
>>
- 将数的所有位向右移动指定的位数。对于有符号整数,左边超出的位用符号位填充(即正数用0填充,负数用1填充)。(低位溢出,符号位不变,用符号位补充高位)
- 示例:
5 >> 2
(二进制:101 >> 2
)结果为1
(二进制:001
)
注意:正数的符号位是0 负数的符号位是1