位移运算符[duo9]
2004-11-23 03:20
387 查看
Java中的位移运算符,是比较令初学者迷惑的地方,尤其是数学基础不好的。至少当初我是如此。
位移运算符(Shift operators)用来操作位,仅仅可以用在基本的整数类型上。
它们分为:
左移运算符号(<<);
右移运算符号(>>);
Java中还有一种特殊的,无正负号的右移运算符(>>>)
(1)左移动运算符:
会将操作的数向左边移动,移动的位的个数由右操作数指定,左移后,低位会被自动补零(0)。
(2)右移动运算符:
反过来,把操作数向右移动,移动的位个数同样由右操作数指定。注意:面对带正负号的数,会采用符号扩展,如果原值是正数,则高位补上0;如果原值是负数,高位补1。
(3)无正负号的右移运算符(>>>):
采用0补充,意思就是说,无论是正号还是负号,都在高位补0。
如果你操作数是比如char,byte,short,位移运算之前,会转型为int,正如前面所说,位移运算符仅仅可以用在类型为int的数值上。
例:
public class URShift{
public static void main(String[] args){
int i=-1;
i>>>=10;
System.out.println(i);
}
}
java: 4194303
怎样工作:
用二进制表示时最高位用0或1表示正负
0表示正 1表示负(不是仅最高为1 而是所有的高位都是1)>> 是带符号右移 右移时左边补符号位
>>> 是不带符号右移 右移时左边补零所以两者在处理 正数时是一样的 左边都补零
但在处理负数时就有区别了 >>补1 >>>补0所以 -1
1111 1111 1111 1111 1111 1111 1111 1111B
i >>>= 10 后
0000 0000 0011 1111 1111 1111 1111 1111B
= 4194303
位移运算符(Shift operators)用来操作位,仅仅可以用在基本的整数类型上。
它们分为:
左移运算符号(<<);
右移运算符号(>>);
Java中还有一种特殊的,无正负号的右移运算符(>>>)
(1)左移动运算符:
会将操作的数向左边移动,移动的位的个数由右操作数指定,左移后,低位会被自动补零(0)。
(2)右移动运算符:
反过来,把操作数向右移动,移动的位个数同样由右操作数指定。注意:面对带正负号的数,会采用符号扩展,如果原值是正数,则高位补上0;如果原值是负数,高位补1。
(3)无正负号的右移运算符(>>>):
采用0补充,意思就是说,无论是正号还是负号,都在高位补0。
如果你操作数是比如char,byte,short,位移运算之前,会转型为int,正如前面所说,位移运算符仅仅可以用在类型为int的数值上。
例:
public class URShift{
public static void main(String[] args){
int i=-1;
i>>>=10;
System.out.println(i);
}
}
java: 4194303
怎样工作:
用二进制表示时最高位用0或1表示正负
0表示正 1表示负(不是仅最高为1 而是所有的高位都是1)>> 是带符号右移 右移时左边补符号位
>>> 是不带符号右移 右移时左边补零所以两者在处理 正数时是一样的 左边都补零
但在处理负数时就有区别了 >>补1 >>>补0所以 -1
1111 1111 1111 1111 1111 1111 1111 1111B
i >>>= 10 后
0000 0000 0011 1111 1111 1111 1111 1111B
= 4194303
相关文章推荐
- 怎么了?
- 怎么了?
- 出发去北京,明天二面IBM CRL
- 关于站长耗子
- 睡觉前的最后一段
- 知识的四个主要特征
- ThreadPool(线程池) in .Net
- 转载的一段话
- 防止spambot
- IE不能打开新窗口的解决办法
- 全力以赴去做好自己现在应该做好的事-11.22
- Usefull Attribute of c#
- 写了一个软件,有兴趣的就用用
- 推荐一款 最方便的 阅读blog的软件---SharpReader!
- 我的 O/R Mapping 之旅(二)
- 庆祝一下! 64位linux安装成功!
- 颠覆比尔·盖茨的神话---Skype
- [小说]我是一条内存
- 疯狂采购·四天满世界乱跑·为了新的改变而战
- 使用 Rational XDE Data Modeler 建模和设计数据库(转自IBM)