移位操作符

移位操作符操作的运算对象也是二进制的“位”。移位操作符只可用来处理整数类型(基本类型的一种)。左移位操作符(<<)能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位被0)。“有符号”右移操作符(">>")则按照操作符右侧指定的位数将操作符左边的操作数向右移动。"有符号"右移位操作符使用"符号扩展":若符号为正,则在高位插入0;若符号为负,则在高位插入1。Java中增加了一种"无符号"右移位操作符(>>>),它使用"零扩展":无论正负,都在高位插入0。这一操作符是C 或 C++中所没有的。

如果对char, byte 或 short类型的数值进行移位处理,那么在移位进行之前,它们会被转换为int类型,并且得到的结果也是一个int类型的值。只有数值右端的低5位才有用。这样可防止我们移位超赤int型值所具有的位数。(译注:因为2的5次方为32,而int型只有32位。)若对一个long类型的数值进行处理,最后得到的结果也是long。此时只会用到数值右端的低6位,以防止移位超过long型数值具有的位数。

"移位"可与"等号"(<<= 或 >>= 或 >>>=)组合使用,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量。但在进行"无符号"右移位结合赋值操作时,可能会遇到一个问题:如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们会先被转换为int类型,再进行右移操作,然后被截断,赋值给原来的类型,在这种情况下可能得到-1结果。下面这个例子演示了这种情况:

byte, short, char 在移位时会被转为 int。(32位为一循环) n >> 32 == n long在移位时保留为long (64位为一循环) n >> 64 == n 移位时超出有效位,正数和零为0,负数为-1

results matching ""

    No results matching ""