>>(Arithmetic right shift 算术右移 (/2)): 低位溢出,符号位不变,符号位补高位(0 or 1)
<<(Arithmetic left shift 算术左移 (*2)):高位溢出,符号位不变,低位补 0
>>>:(logical right shift) === (Usigned right shift) 无符号右移,低位溢出,高位补0
NO NO NO have <<<
ex1:
int a=1>>2;// (/2/2) = 0 (Java 默认int type 1/2/2=0.25 自动转化数据类型 (int)0.25 = 0)
@1.正数1(3码合1)
00000000 00000000 00000000 00000001 (补码运算)
@2.>> (右移,补符号)
—》00000000 00000000 00000000 00000001
—》0000000000 00000000 00000000 00000001 (补码运算,原码显示)
ex2:
int b=-1 << 3;// (*2*2*2)= -8
@1.负数(-1)
#1.负数原码
10000000 00000000 00000000 00000001
#2.负数反码(符号位不变,其余取反)
11111111 11111111 11111111 111111110
#3.负数补码(反码+1)
11111111 11111111 11111111 111111111(补码运算)
第一步就是将,负数转化补码,可以参与运算,java中
@2.<< 3 (左移3位)
11111111 11111111 11111111 111111111 (补码开始操作)
11111111 11111111 11111111 111111111000(补3个0)
《—定框,左滚动— 11111111 11111111 11111111 111111111000 (溢出3个1,符号位不变)
11111 11111111 11111111 111111111000 (结果显示,补码)
左移动,二进制,(就像电子显示屏幕,就那么大的长方形的框,多出的,就滚动走进溢出,滚动走进的就是补位),滚走111,但是符号位不变,滚进000
@3.补码还原码
11111 11111111 11111111 111111111000 (补码)
11111 11111111 11111111 111111111000 (反码=补码-1)
11111 11111111 11111111 111111110111 (反码)
11111 11111111 11111111 111111110111 (原码,反码,符号位不变,取反)
10000 00000000 00000000 00000001000 (调整8bits=1 Byte)
10000000 00000000 00000000 00001000 (原码 -8)
将补码换算原码,显示输出(why? 补码运算,简化底层硬件设计,没有正负0)
public class BitOperator{
public static void main(String[] args){
System.out.println(1>>2);//0
System.out.println(-1<<3);//-8
}
}