有符号整数的移位操作(按其补码移位规则进⾏操作)
【知识点】
算法运⾏时,输⼊的整数默认情况下被计算机系统表⽰为有符号整数。有符号整数的⼆进制表⽰中,最⾼位为符号位(正整数为0,负整数为1),这也是有符号整数名称的由来。有符号整数移位时,按照补码的移位规则进⾏移位。即:
当有符号整数进⾏位运算“左移(<<)”时,规则是“符号位不变,移出位丢弃,空出位补0”。即正整数左移N位时低位依次填充N个0,负整数左移N位时低位依次填充N个0。例如:
0000 0010 << 1 = 0000 0100
0000 1010 << 2 = 0010 1000
1000 0010 << 1 = 1100 0100
1000 1010 << 3 = 1101 0000
当有符号整数进⾏位运算“右移(>>)”时,规则是“符号位不变,移出位丢弃,空出位补符号位”。即正整数右移N位时⾼位依次填充N 个0,负整数右移N位时⾼位依次填充N个1。例如:
0000 0010 >> 1 = 0000 0001
0000 1010 >> 2 = 0000 0010
1000 0010 >> 1 = 1100 0001
1000 1010 >> 3 = 1111 0001
或者,总结为“当有符号整数进⾏位运算“左移(<<)”时,规则是“符号位不变,移出位丢弃,空出位补0”。当有符号整数进⾏位运
算“右移(>>)”时,规则是“符号位不变,移出位丢弃,空出位补符号位”。
--------------------------------------------------------
左移的特殊情况:
左移⾥⼀个⽐较特殊的情况是当左移的位数超过该数值类型的最⼤位数时,编译器会⽤左移的位数去模类型的最⼤位数,然后按余数进⾏移位。如:
int i=1; //设int为32位
i=i<<33; // 33%32=1,左移1位,i变成2
负数二进制补码运算法则正数的反码等于其原码。正数的补码等于其原码。 负数的反码等于对负数原码符号位以外的各位取反(0变1,1变0)。负数的补码等于负数反码加1。