首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >负数移位

负数移位
EN

Stack Overflow用户
提问于 2013-09-12 18:23:51
回答 2查看 810关注 0票数 4

我对这句话很困惑。我是一个Java程序员,但我对位操作不是很熟悉。

我想我正确地理解了以下几点:

代码语言:javascript
复制
Input : 1 << 10
Output: 0000000000000000000010000000000

对于正数,我认为是你移动1乘10位。

令人困惑的是,当我有以下内容时:

代码语言:javascript
复制
int val = -10 (binary representation : 1111111111111111111111111110110 )
Input : 1 << val
Output: 0000000010000000000000000000000 

如果有人能用负数解释左移或右移的含义,那就太好了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-12 18:26:47

<< (和其他移位操作符)对于int只占用其右操作数中最不重要的5位,对于long只占用6位,因为将int移位超过31是没有意义的。

在您的例子中,是0b10110 = 22

因此,1 << (-10)等同于1 << 22

票数 9
EN

Stack Overflow用户

发布于 2013-09-12 18:30:51

来自JLS,第15.19款

如果左手操作数的提升类型为int,则只使用右边操作数的五个最低阶位作为移位距离。这就好像右边的操作数受到了位逻辑和运算符的影响& (§15.22.1),掩码值为0x1f (0b11111)。因此,实际使用的移位距离总是在0到31之间,包括在内。

换句话说,

代码语言:javascript
复制
1 << -10

相当于:

代码语言:javascript
复制
1 << (-10 & 0x1f)

..。这就是

代码语言:javascript
复制
1 << 22
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18771704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档