规整:位运算,参与运算码为2进制码,补码参与运算。
a左移n位 =a*2^n;( 正负数左移,绝对值一致.。例:10*2^2 = 40, -10/2^2 = -40);
b右移动n位 = b/2^n ( 整数右移 ,例:10/2^2 = 2;负数右移,运算除不尽结果-1。 例:- 10/2^2= - 2 - 1= - 3);
一.正数的左移右移运算
a. 左移规则:高位丢失,低位补零
示例:a=10,a<<2
源码:0000 0000 0000 0000 0000 0000 0000 1010
反码:0000 0000 0000 0000 0000 0000 0000 1010
前补码:0000 0000 0000 0000 0000 0000 0000 1010
左移2位,运算后:
后补码:【-00】00 0000 0000 0000 0000 0000 0000 1010【+00】
反码: 0000 0000 0000 0000 0000 0000 0010 1000
补码:0000 0000 0000 0000 0000 0000 0010 1000
结果:a= 40
b.右移规则:低位丢失,高位补零
示例:a=10,a>>2
源码:0000 0000 0000 0000 0000 0000 0000 1010
反码:0000 0000 0000 0000 0000 0000 0000 1010
前补码:0000 0000 0000 0000 0000 0000 0000 1010
右移2位,运算后:
后补码:【+00】00 0000 0000 0000 0000 0000 0000 10【-10】
反码:0000 0000 0000 0000 0000 0000 0000 0010
补码:0000 0000 0000 0000 0000 0000 0000 0010
结果:a= 2
二.负数的左移右移运算
a. 左移规则:高位丢失,低位补零
示例:a= -10,a<<2
源码:1000 0000 0000 0000 0000 0000 0000 1010
反码:1111 1111 1111 1111 1111 1111 1111 0101
前补码:1111 1111 1111 1111 1111 1111 1111 0110(反码+1)
左移2位,运算后:
后补码:【-11】11 1111 1111 1111 1111 1111 1111 0110【+00】
反码: 1000 0000 0000 0000 0000 0000 0010 0111(反码+1)
补码:1000 0000 0000 0000 0000 0000 0010 1000
结果:a= -40
b.右移动规则:低位丢失,高位补1
示例:a= -10,a>>2
源码:1000 0000 0000 0000 0000 0000 0000 1010
反码:1111 1111 1111 1111 1111 1111 1111 0101
前补码:1111 1111 1111 1111 1111 1111 1111 0110(反码+1)
右移2位,运算后:
后补码:【+11】1111 1111 1111 1111 1111 1111 1111 01【-10】
反码:1000 0000 0000 0000 0000 0000 0000 0010
补码:1000 0000 0000 0000 0000 0000 0000 0011
结果:a= -3