移位操作符

Posted skye-you

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移位操作符相关的知识,希望对你有一定的参考价值。

移位操作符

  • byte short char等类型进行移位前会先转换成int型
  • long 型转换前后皆为long
  • 符号左边为操作数,右边为操作数向左或向右移动的位数
  • 移位 可与 等号组合使用
  • eg.>>= 先移位再赋值给左边的变量

分类:

  • 左移位操作符 << :向左移动,低位补0
  • 有符号右移位操作符 >> :向右移动,负数高位补1,正数高位补0
  • 无符号右移位操作符 >>>:向右移动,高位补0 (c++/c 中都没有)

举例

public class Main {
    public static void main(String[] args) {
        int i = 100;
        System.out.println(Integer.toBinaryString(i));
        System.out.println(Integer.toBinaryString(-i));
        System.out.println(Integer.toBinaryString(i << 4));
        System.out.println(Integer.toBinaryString(-i << 4));
        System.out.println(Integer.toBinaryString(i >> 4));
        System.out.println(Integer.toBinaryString(-i >> 4));
        System.out.println(Integer.toBinaryString(i >>> 4));
        System.out.println(Integer.toBinaryString(-i >>> 4));
    }
}

result:
1100100
11111111111111111111111110011100
11001000000
11111111111111111111100111000000
110
11111111111111111111111111111001
110
1111111111111111111111111001
  • think in java 中提到 只有数值右端的低5位才有用,这样可防止我们移位超过int型值所具有的位数
  • 因为int型占4字节,共32位,也就是说,一个操作数最多移动32位就毫无意义了,所以移位运算符右端的数字最大不能超过32位,即最大11111,一个数的低五位即可表示。
  • 如果运算符右端的数字大于等于32,则可通过取32的模来得到真正需要移动的位数,eg. 1>>34,右边的34>32,因此需要让34对32取余,结果为34%32=2,因此真正的移位运算应该是1>>2
  • 同理long型占8字节,共64位,运算符右端数值的低6位对应的十进制才是有效移动位数。

以上是关于移位操作符的主要内容,如果未能解决你的问题,请参考以下文章

STM32IO口8位操作移位的方式

移位操作符

(计算机组成原理)第二章数据的表示和运算-第二节3:定点数的移位运算(算数移位逻辑移位和循环移位)

使用移位操作代替乘除运算

有趣的移位操作!彻底弄懂各个移位操作符的使用方式

移位运算溢出:右操作数须小于左操作数的位数