首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么逻辑左移和算术左移是一样的?

为什么逻辑左移和算术左移是一样的?
EN

Stack Overflow用户
提问于 2021-07-15 04:21:13
回答 2查看 211关注 0票数 0

我知道外面也有类似的问题。但我好奇的是,为什么逻辑左移和算术左移是一样的。

我知道算术左移和逻辑左移在技术上是相同的,因为msb (最高有效位)在这两个操作中都不会被保留,msb被替换为0,所有的位都被简单地“左移”。但是,为什么我们不能保留msb,同时将剩下的位移位给左算术移位呢?算术右移保留了msb来表示带符号的位,那么为什么我们不对算术左移做同样的事情呢?

例如,在Java语言中:">>>“是逻辑右移,">>”是算术右移,但是"<<“执行算术/逻辑左移,即使带符号的位没有保留。

EN

回答 2

Stack Overflow用户

发布于 2021-07-15 04:40:49

但是,为什么我们不能保留最大有效位,同时把剩下的位移位给左算术移位呢?

我们可以做到这一点,例如,这是该想法的java实现:

代码语言:javascript
运行
复制
int shiftLeftPreserveMSB(int x, int k) {
    return (x & Integer.MIN_VALUE) | ((x << k) & Integer.MAX_VALUE);
}

但这真的有用吗?例如,它有一个可疑的属性,即每当结果与x << k不同时,两个结果都不匹配(long)x << k。从算术的角度来看,这似乎不是很有用。也许是,但至少这是一个奇怪的操作。像这样的操作可能还有其他用途,比如在bithack中,尽管我不知道有任何这样的用途。

票数 0
EN

Stack Overflow用户

发布于 2021-07-15 05:50:23

正常的左和右算术移位都保留符号位。所以

代码语言:javascript
运行
复制
-32 >> 1 == -16
-16 << 1 == -32

因此,左算术移位在某种意义上是算术和逻辑的,因为算术和非算术比特操作都可以完成。

但需要特殊处理右逻辑移位,以移位符号位并在左侧填充0位。

-1 >>> 1 == 2147483647

如果要完成非算术比特操作,这是必不可少的。但是如何进行保留符号的左算术移位呢?

考虑一个4位寄存器,msb是符号,它被保留。假设<<操作符的工作方式如下

代码语言:javascript
运行
复制
0111 == 7
0111 << 1 == 0110 == 6
0110 << 1 == 0100 == 4
0100 << 1 == 0000 == 0

国际海事组织,这不会有太大的用处。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68384618

复制
相关文章

相似问题

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