现在的位置: 首页 > 综合 > 正文

java的左右移

2013年08月01日 ⁄ 综合 ⁄ 共 1054字 ⁄ 字号 评论关闭
 

左移<<:

        在对byte和short类型的值进行移位运算时,你必须小心。因为Java在对表达式求
值时,将自动把这些类型扩大为 int型,而且,表达式的值也是int型 。对byte和short类型
的值进行移位运算的结果是int型,而且如果左移不超过31位,原来对应各位的值也不会丢
弃。但是,如果你对一个负的byte或者short类型的值进行移位运算,它被扩大为int型后,
它的符号也被扩展。这样,整数值结果的高位就会被1填充。

右移>>:

        右移时,被移走的最高位(最左边的位)由原来最高位的数字补充。例如,如果要移
走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补
0,这叫做符号位扩展(保留符号位)(sign extension),在进行右移操作时用来保持负数
的符号。

无符号右移>>>:

不管运算数的初值是什么,移位后总是在高位(最左边)补0

由于无符号右移运算符>>>只是对32位和64位的值有意义,所以它并不像你想象的那
样有用。因为你要记住,在表达式中过小的值总是被自动扩大为int型。这意味着符号位扩
展和移动总是发生在32位而不是8位或16位。这样,对第7位以1开始的byte型的值进行无符
号移动是不可能的,因为在实际移动运算时,是对扩大后的32位值进行操作。

例如:

class ByteUShift {
static public void main(String args[]) {
char hex[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
byte b = (byte) 0xf1;
byte c = (byte) (b >> 4);
byte d = (byte) (b >>> 4);
byte e = (byte) ((b & 0xff) >> 4);
System.out.println(" b = 0x"
+ hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
System.out.println(" b >> 4 = 0x"
+ hex[(c >> 4) & 0x0f] + hex[c & 0x0f]);
System.out.println(" b >>> 4 = 0x"
+ hex[(d >> 4) & 0x0f] + hex[d & 0x0f]);
System.out.println("( b & 0xff) >> 4 = 0x"
+ hex[(e >> 4) & 0x0f] + hex[e & 0x0f]);
}
}

结果:

b = 0xf1
b >> 4 = 0xff
b >>> 4 = 0xff
(b & 0xff) >> 4 = 0x0f

抱歉!评论已关闭.