位移操作

chenchengamao 2011-09-14 03:15:22
int x = 15 << -1;
int x = 15 >> -1;
int x = 15 >>> -1;


这三种位移操作符右边的操作数可以是负数吗,如果可以,它们的值要怎么计算?
...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
可以是负数。对于 int 来说只取这个负数二进制的低 5 位,可以参考这个帖子:

http://topic.csdn.net/u/20080621/17/23cb5242-12d0-4584-86b9-7483a305f5dd.html
lost_guy_in_scut 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qybao 的回复:]

那就看编译器怎么实现了
当超出左移int的范围时,会循环回到右边
也就是说
int x = 15 << 32; //x == 15
int y = 15 << 33; //y == 15 << 1
a << b 等价于 a << (b%32)

同时,根据这个32位一个周期循环,可以知道
a << -b 等价于 a << (-b%32)+32

所以
int x = 1……
[/Quote]
宝哥v5
daijope 2011-09-14
  • 打赏
  • 举报
回复
学习了,,挺好。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qybao 的回复:]
那就看编译器怎么实现了
当超出左移int的范围时,会循环回到右边
也就是说
int x = 15 << 32; //x == 15
int y = 15 << 33; //y == 15 << 1
a << b 等价于 a << (b%32)

同时,根据这个32位一个周期循环,可以知道
a << -b 等价于 a << (-b%32)+32

所以
int x = 15……
[/Quote]

确实确实。。
小绵羊 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qybao 的回复:]

那就看编译器怎么实现了
当超出左移int的范围时,会循环回到右边
也就是说
int x = 15 << 32; //x == 15
int y = 15 << 33; //y == 15 << 1
a << b 等价于 a << (b%32)

同时,根据这个32位一个周期循环,可以知道
a << -b 等价于 a << (-b%32)+32

所以
int x = 1……
[/Quote]
阿宝都说了,咱就没啥好说的了
安心逍遥 2011-09-14
  • 打赏
  • 举报
回复
mark mark
qybao 2011-09-14
  • 打赏
  • 举报
回复
那就看编译器怎么实现了
当超出左移int的范围时,会循环回到右边
也就是说
int x = 15 << 32; //x == 15
int y = 15 << 33; //y == 15 << 1
a << b 等价于 a << (b%32)

同时,根据这个32位一个周期循环,可以知道
a << -b 等价于 a << (-b%32)+32

所以
int x = 15 << -1; 等价于 int x = 15 << (-1 + 32)
int x = 15 >> -1; 等价于 int x = 15 >> (-1 + 32)
int x = 15 >>> -1; 等价于 int x = 15 >>> (-1 + 32)
原来缘来 2011-09-14
  • 打赏
  • 举报
回复

public static void main(String[] args) {
int x = 15 << -1;
int x2 = 15 >> -1;
int x3 = 15 >>> -1;
System.out.println(x);
System.out.println(x2);
System.out.println(x3);
}


打印结果
-2147483648
0
0

难以理解
风尘中国 2011-09-14
  • 打赏
  • 举报
回复
从逻辑上讲一位操作数必须是正整数,建议楼主研究好正确移位操作怎么回事就可以了,正常的还没弄清楚弄这些边缘的不正常的语法没啥实用价值,反而会迷惑

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧