众所周知,计算机存储的数据,正数使用二进制表示,负数使用补码表示。
十进制与二进制转换方法;
正数转二进制:
将该数除以2,得到的余数就是二进制的最低位,反复相除,当结果为0时,将所有余数排列得到的就是该数的二进制。例如13转二进制:
13/2=6......1
6/2=3......0
3/2=1......1
1/2=0......1
即13的二进制为:1101
二进制转正数:
1101,1*2的三次方+1*2的二次方+0*2的1次方+1*2的0次方,结果为8+4+1=13
负数转补码:
1.先将正数部分按照上述方法转成二进制;
2.然后将得到的二进制结果取反(0变1,1变0);
3.将取反后二进制加1;
得到的就是负数的补码。
例如-10,正数部分转成二进制为1010,取反后0101,加1后0110。0110就是负数-10的补码。
补码转负数:
1.将补码取反;
2.取反后结果加一;
3.按照二进制转正数方法转成正数;
4.加上负号。
例如0110,取反1001,加一1010,转正数:1*2的三次方+0*2的二次方+1*2的一次方+0*2的0次方=8+0+2+0=10,加上负号-10.
二进制之间的运算类型:
-
位与(AND,符号&):如果两个相应的位都是1,则结果为1,否则为0。
-
例如:5和10位与运算(5&10),5的二进制位0101,10的二进制1010,得到结果为0000,即结果为0。
-
位或(OR,符号|):如果两个相应的位中至少有一个是1,则结果为1,否则为0。
-
例如:5和10位或运算(5|10),5的二进制位0101,10的二进制1010,得到结果为1111,即结果为15。
-
位异或(XOR,符^):如果两个相应的位不同,则结果为1,否则为0。
-
例如:5和10位异或运算(5^10),5的二进制位0101,10的二进制1010,得到结果为1111,即结果为15。
-
位非(NOT,符号~):对一个数的每个位取反,即1变成0,0变成1。上述负数转补码第二步就是位非运算。
-
例如:5的位非运算(~5),5的二进制为101,计算后最高位符号改变,所以从二进制变成补码,为11111010,是-6的补码,即结果为-6
-
左移(Left Shift,符号<<):将一个数的所有位向左移动指定的位数,右边空出的位用0填充。
-
例如:5左移一位(5<<1),5的二进制为101,计算后1010,结果为10
-
-5左移一位(-5<<1),-5补码为11111011,计算后11110110,转成十进制为-10
-
右移(Right Shift,符号>>):将一个数的所有位向右移动指定的位数,左边空出的位用符号位(最高位)的值填充。
-
例如:5右移一位(5>>1),5的二进制为101,计算后010,结果为2
-
-5右移一位(-5>>1),-5补码为11111011,计算后11111101,转换成十进制为-3
-
无符号右移(Unsigned Right Shift,符号>>>):将一个数的所有位向右移动指定的位数,右边空出的位用0填充,不论原来的符号位是什么。
-
例如:5无符号右移一位(5>>>1),5的二进制为101,计算后010,结果为2
-
-5无符号右移一位(-5>>>1),-5补码为11111011,计算后01111101,转换成十进制为2147483645,因为无符号右移后最大位补充的是0,转换成十进制后会变成1,在前面为了方便所以只写了二进制或补码的简写,完整写法应该是32位表示,而2147483647是32位能表示的最大数,所以是2147483647。
-
注意右移和无符号右移对于负数的区别

1471

被折叠的 条评论
为什么被折叠?



