在HashMap中看到这么一段代码:
static int hash(Object x) {
int h = x.hashCode(); h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}一直搞不明白 其中的">>>"是什么操作符?????
static int hash(Object x) {
int h = x.hashCode(); h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}一直搞不明白 其中的">>>"是什么操作符?????
result任何变量。expression1任何表达式。expression2任何表达式。说明
>>> 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。例如: var temp
temp = -14 >>> 2变量 temp 的值为 -14 (即二进制的 11111111 11111111 11111111 11110010),向右移两位后等于 1073741820 (即二进制的 00111111 11111111 11111111 11111100)。
//对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000
int y;
y = x>>1;//前面补1变成
//1100,0000,0000,0000,0000,0000,0000,0000,0000
System.out.println(y);//-1073741824
int x = 0x80000000;
//对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000
int y;
y = x>>>1;//前面补1变成
//0100,0000,0000,0000,0000,0000,0000,0000,0000
System.out.println(y);
//我们知道二进制数最前面一位代表正负0为正1为负
//>>>和>>
//>>>是不管以前是多少直接在前面补0
//>>是以前前面是1就补1是0就补0
//移位中要注意的:
//低于int的 编译器先把数据提升为int再移位
//int是32位数据所以移位33和移位1效果是一样的
//同理long是64为数据移位65和移位1效果是一样的
//可以这样说a>>b移位实际是 b除以a的数据位数(32或64)再取模
//移位不会改变变量的的值 比如a>>1这毫无意义; b=a>>1才有意义
//x>>1与x/2结果一样 x<<2和x*4结果也一样
//总之一个数左移n位等于这个数乘以2的n次方
//右移n位等于这个数除以2的n次方
//对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000
int y;
y = x>>1;//前面补1变成
//1100,0000,0000,0000,0000,0000,0000,0000,0000
System.out.println(y);//-1073741824
int x = 0x80000000;
//对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000
int y;
y = x>>>1;//前面补1变成
//0100,0000,0000,0000,0000,0000,0000,0000,0000
System.out.println(y);
//我们知道二进制数最前面一位代表正负0为正1为负
//>>>和>>
//>>>是不管以前是多少直接在前面补0
//>>是以前前面是1就补1是0就补0
//移位中要注意的:
//低于int的 编译器先把数据提升为int再移位
//int是32位数据所以移位33和移位1效果是一样的
//同理long是64为数据移位65和移位1效果是一样的
//可以这样说a>>b移位实际是 b除以a的数据位数(32或64)再取模
//移位不会改变变量的的值 比如a>>1这毫无意义; b=a>>1才有意义
//x>>1与x/2结果一样 x<<2和x*4结果也一样
//总之一个数左移n位等于这个数乘以2的n次方
//右移n位等于这个数除以2的n次方
//对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000
int y;
y = x>>1;//前面补1变成
//1100,0000,0000,0000,0000,0000,0000,0000,0000
System.out.println(y);//-1073741824
int x = 0x80000000;
//对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000
int y;
y = x>>>1;//前面补1变成
//0100,0000,0000,0000,0000,0000,0000,0000,0000
System.out.println(y);
//我们知道二进制数最前面一位代表正负0为正1为负
//>>>和>>
//>>>是不管以前是多少直接在前面补0
//>>是以前前面是1就补1是0就补0
//移位中要注意的:
//低于int的 编译器先把数据提升为int再移位
//int是32位数据所以移位33和移位1效果是一样的
//同理long是64为数据移位65和移位1效果是一样的
//可以这样说a>>b移位实际是 b除以a的数据位数(32或64)再取模
//移位不会改变变量的的值 比如a>>1这毫无意义; b=a>>1才有意义
//x>>1与x/2结果一样 x < <2和x*4结果也一样
//总之一个数左移n位等于这个数乘以2的n次方
//右移n位等于这个数除以2的n次方
左移:<<
带符号右移:>>
无符号右移:>>>