java中左移位怎么用(带你彻底弄清移位运算)
java中左移位怎么用(带你彻底弄清移位运算)
Java中的移位运算- <<
- >>
- >>>
- 移位运算结果
- 注意
- <<: 左移运算 左移几位就补几个0
- >>: 右移运算 为算术右移如果数字为正数时 移位后在前面补0如果数字为负数时 移位后在前面补1
- >>>: 无符号右移 为逻辑右移.忽略符号 空位补0
- 无符号右移规则: 忽略了符号位扩展 0补最高位 无符号右移运算符 >>> 只对32位和64位值有意义
- 如果要移位的数是正数时:右移和无符号右移的值是一样的
- 如果要移位的数是负数时:右移后的值还是负数符号右移后的值则为正数
- 区别:对于正数而言 >> 和 >>> 没有区别对于负数而言 由于无符号右移忽略了最高位数的符号位.所以:-2 >>> 1 = 2147483647(Integer.MAX_VALUE)-1 >>> 1 = 2147483647(integer.MAX_VALUE)因此要判断两个Integer类型的数符号是否相同 可以这样判断:return ((a >> 31) ^ (b >> 31)) == 0;
- 在不大于自身数值类型最大位数的移位时 一个数左移n位 就是将这个数乘以2的n次幂
- 一个数右移n位 就是将这个数除以2的n次幂 然后取整如果移动位数超出自身数值类型的最大位数 只要将移位数和自身数值类型的最大位数取余得到的数字套用方法即可
- 三种移位运算作用的左操作数有五种:longintshortbytechar在作用不同的操作数类型时的具体操作过程不同 遵循以下原则:int移位时 左操作数是32位 此时移位符号作用在32位bit上比如: 1 >> 3 是将00000000 00000000 00000000 00000001这32位向右移动3位long移位时 左操作数是64位 此时移位符号作用在64位bit上short byte char在移位之前首先将数据转换为int 然后再移位 此时移位符号作用在32位bit上比如: (byte)0xff >>> 7 是将11111111 11111111 11111111 11111111这32位向右移动7位 得到的结果是00000001 11111111 11111111 11111111
- 由上可知:当左操作数为long时 移位之后得到的类型是long当左操作数是其它四种类型时 移位之后得到的类型时int所以当左操作数是short byte char时 使用 >>= >>>= <<= . 其实是将得到的int最低位截取得到的数值 得到的值往往会错
- 三种移位符号除了对左操作数有操作规则外 对右操作数也有操作规则:如果左操作数是int或者转换之后是int 那么右操作数只有低5位有效 因为int总共就32位22 >> 33 与 22 >> 1 的结果是一样的 都是11如果左操作数是long 那么右操作数只有低6位有效