位移进制运算
位移进制运算
带符号右移 题:-15 >> 2 = -4
15原码: 00000000 00000000 00000000 00001111 //32位,二进制
反码: 11111111 11111111 11111111 11110000 //0变1,1变0
补码: 11111111 11111111 11111111 11110001 //最后位加1,-15二进制
右移2位: 11111111 11111111 11111111 11111100 //右边丢弃2位,前面30位保留,左边补1
取反: 00000000 00000000 00000000 00000011 //0变1,1变0
+1: 3+1
结果: =-4 //负号保留,十进制
带符号左移 题: 10 << 2 = 40
10 补码: 00000000 00000000 00000000 00001010 //32位,二进制
左移2位: 00000000 00000000 00000000 00101000 //左边丢弃2位,右边补0
结果: 40 //十进制
无符号右移 题:-4321 >>> 30 = 3
4321原码: 00000000 00000000 00010000 11100011 //32位,二进制
反码: 11111111 11111111 11101111 00011100 //0变1,1变0
补码: 11111111 11111111 11101111 00011101 //最后位加1,-4321二进制
无符号右移30位: 00000000 00000000 00000000 00000011 //右边丢弃30位,前面二位保留,左边补0
结果: 3 //十进制
& 位逻辑与 题:44 & 21 = 4
44 补码: 00000000 00000000 00000000 00101100 //32位,二进制
21 补码: 00000000 00000000 00000000 00010101 //32位,二进制
& 运算: 00000000 00000000 00000000 00000100 //对应的两个二进制位均为1时 结果位才为1 否则为0
结果: 4 //十进制
| 位逻辑与 题:9 | 5 = 13
9 补码: 00000000 00000000 00000000 00001001 //32位,二进制
5 补码: 00000000 00000000 00000000 00000101 //32位,二进制
| 运算: 00000000 00000000 00000000 00001101 //对应的二个二进制位有一个为1时,结果位就为1
结果: 13 //十进制
^ 位逻辑异或 题: 9 ^ 5 = 12
9 补码: 00000000 00000000 00000000 00001001 //32位,二进制
5 补码: 00000000 00000000 00000000 00000101 //32位,二进制
| 运算: 00000000 00000000 00000000 00001100 //对应的二进制位相异时,结果为1
结果: 12 //十进制
~ 位逻辑反 题: ~9 = -10
9 补码: 00000000 00000000 00000000 00001001 //32位,二进制
~ 运算: 11111111 11111111 11111111 11110110 //最高位为1表示为一个负数,则进行取反加1
取反: 00000000 00000000 00000000 00001001 //32位,二进制
+1: 9+1 //32位,二进制
结果: -10 //十进制
在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
0000111按位取反为1111000;再加1,所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。
带符号右移 题:-15 >> 2 = -4
15原码: 00000000 00000000 00000000 00001111 //32位,二进制
反码: 11111111 11111111 11111111 11110000 //0变1,1变0
补码: 11111111 11111111 11111111 11110001 //最后位加1,-15二进制
右移2位: 11111111 11111111 11111111 11111100 //右边丢弃2位,前面30位保留,左边补1
取反: 00000000 00000000 00000000 00000011 //0变1,1变0
+1: 3+1
结果: =-4 //负号保留,十进制
带符号左移 题: 10 << 2 = 40
10 补码: 00000000 00000000 00000000 00001010 //32位,二进制
左移2位: 00000000 00000000 00000000 00101000 //左边丢弃2位,右边补0
结果: 40 //十进制
无符号右移 题:-4321 >>> 30 = 3
4321原码: 00000000 00000000 00010000 11100011 //32位,二进制
反码: 11111111 11111111 11101111 00011100 //0变1,1变0
补码: 11111111 11111111 11101111 00011101 //最后位加1,-4321二进制
无符号右移30位: 00000000 00000000 00000000 00000011 //右边丢弃30位,前面二位保留,左边补0
结果: 3 //十进制
& 位逻辑与 题:44 & 21 = 4
44 补码: 00000000 00000000 00000000 00101100 //32位,二进制
21 补码: 00000000 00000000 00000000 00010101 //32位,二进制
& 运算: 00000000 00000000 00000000 00000100 //对应的两个二进制位均为1时 结果位才为1 否则为0
结果: 4 //十进制
| 位逻辑与 题:9 | 5 = 13
9 补码: 00000000 00000000 00000000 00001001 //32位,二进制
5 补码: 00000000 00000000 00000000 00000101 //32位,二进制
| 运算: 00000000 00000000 00000000 00001101 //对应的二个二进制位有一个为1时,结果位就为1
结果: 13 //十进制
^ 位逻辑异或 题: 9 ^ 5 = 12
9 补码: 00000000 00000000 00000000 00001001 //32位,二进制
5 补码: 00000000 00000000 00000000 00000101 //32位,二进制
| 运算: 00000000 00000000 00000000 00001100 //对应的二进制位相异时,结果为1
结果: 12 //十进制
~ 位逻辑反 题: ~9 = -10
9 补码: 00000000 00000000 00000000 00001001 //32位,二进制
~ 运算: 11111111 11111111 11111111 11110110 //最高位为1表示为一个负数,则进行取反加1
取反: 00000000 00000000 00000000 00001001 //32位,二进制
+1: 9+1 //32位,二进制
结果: -10 //十进制
在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
0000111按位取反为1111000;再加1,所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。