二进制转十六进制为什么四个一组 二进制转十六进制 16进制转10进制( 二 )


反码:正数的反码还是等于原码 。负数的反码就是他的原码除符号位外,按位取反 。
补码:正数的补码是其本身,负数的补码是在其反码的基础上+1 。(计算机中,数值一律用补码表示和存储的)
小结:正数的原码、反码、补码一样 。负数的反码是原码除符号位取反,补码是反码+1
示例:

-2
2
原码
1000 0000 0000 0010
0000 0000 0000 0010
反码(负数符号位不变,其他取反)
1111 1111 1111 1101
0000 0000 0000 0010
补码(负数是反码+1)
1111 1111 1111 1110
0000 0000 0000 0010
备注:其实2是int型,在java中是以4个字节,32位存在的 。
二进制位运算计算机计算和存值都是补码,正数补码是原码 。负数补码是原码取反+1 。
最高位是符号位:0表示正,1表示负
位运算符有:与 & 、 或| 、异或^、取反~ 、左移位<< 、
数学右移位(有符号右移)>> 、逻辑右移位(无符号右移)>>>
1.1与运算:&
与运算的操作符为& 。两者为1才为1,否则为0 。即:1&1=1;1&0=0;0&0=0.
比如计算15&10,首先15的二进制为:1111,10的二进制为1010,所以15&10为:

二进制转十六进制为什么四个一组 二进制转十六进制 16进制转10进制

文章插图
所以15&10=10 。
1.2或运算:|
或运算的操作符为| 。一个为1则为1,两者为0则为0 。即:1|1=1;1|0=1;0|0=0.
比如计算15&10,首先15的二进制为:1111,10的二进制为1010,所以15|10为:
二进制转十六进制为什么四个一组 二进制转十六进制 16进制转10进制

文章插图
所以15|10=15 。
1.3 取反运算:~
取反运算的操作符为~,取反 。即:~1=0;~0=1.
比如计算~10,首先10的二进制为:1010,~10为:
二进制转十六进制为什么四个一组 二进制转十六进制 16进制转10进制

文章插图
~10=5 。
1.4 异或运算:^
异或运算的操作符为^ 。相同为0,不同为1 。即:1^1=0;1^0=1;0^0=0.
比如计算15^10,首先15的二进制为:1111,10的二进制为1010,所以15^10为:
二进制转十六进制为什么四个一组 二进制转十六进制 16进制转10进制

文章插图
所以15^10=5 。
左移:<<左移就是将二进制的所有的数字向左移动对应的位数,高位舍去,低位补零
左移将原数乘以2的n次方 。
100 << 2
二进制补码:00000000 00000000 00000001 100100
二进制左移2位: 00 | 00000000 00000000 00000001 100100 00
解释: | 前面被剔除,后面缺少的两个补0
结果:左移两位相当于乘以22,结果为100 << 2= 100 * 22 = 400
右移:>>右移就是将二进制的所有的数字向右移动对应的位数,低位舍去,高位补符号位 。即正数补0,负数补1
右移将原数除以2的n次方 。
100 >> 2
二进制补码: 00000000 00000000 00000000 01100100
二进制右移2位: 00000000 00000000 00000000 00011001 | 00
解释: | 后面被剔除,前面缺少的两个补0,符号位是0则补0
结果: 右移两位相当于除以2,再除以2,结果为100 >> 2= 100 / 22 = 25
无符号右移:>>>无符号右移就是将二进制的所有的数字向右移动对应的位数,低位舍去,高位补零 。
-10 >>> 1
二进制补码: 11111111 11111111 11111111 11110110
二进制无符号向右移1位: 0 1111111 11111111 11111111 11111011 | 0
结果:负数进行无符号右移会变为正数 。
二进制位运算运用2.1任何一个数和0异或是它的本身,和自身异或为0 。
a^0=a ; a^a=0
利用上述性质,可以用来计算2个数的交换 。
大家应该知道,在计算机里,两个数互相交换,需要定义一个中间的变量来参与交换 。如:
int tmp;
int a=10;
int b=20;
tmp=a;
a=b;
b=tmp;
上述代码计算之后,a和b的值完成交换,a的值为20,b的值为10 。
如果用异或运算来交换2个数,可以如下方法:
int a=10;
int b=20;
a=a^b;
b=a^b;
a=a^b;
上述运行之后,a和b依然完成了值的交换,但由于是异或位运算,所以效率比上面的代码要高 。
证明:
a=10^20
b=a^b=(10^20)^20=10^20^20=10^0=10
a=a^b=10^20^10=10^10^20=0^20=20
2.2左移( << )不需要考虑最高位补位问题,因为高位会被直接溢出 。右移有符号右右移(>>)和无符号右移(>>>),有符号右移最高位要补符号位,无符号右移最高位只需要补零即可 。所以无符号右移负数时,会变为正数 。
2.3 右移就是原数除以2的n次方 。左移就是原数乘以2的n次方 。