gpt4 book ai didi

c++ - 了解带移位的右移运算符

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:09:11 31 4
gpt4 key购买 nike

我很难理解右移运算符。我理解左移。假设我们没有

int n = 11; which is 1011

现在如果我们左移它n << 1结果是

int a = n << 1 ; so a = 10110; (simply add a 0 to the end)

这是有道理的

现在右移是我遇到困难的地方

int a = n >> 1

我认为答案是 01011 (在前面加一个 0)这又是 1011,但现在是 101。我的问题是我们是如何丢失最后一位数字的。

更新:我对此的推理可能是假设一个 int 是 8 位,在这种情况下我们将有int8 n = 1011 => 即 00001011所以当我们右移 1 它超过 8 位 int 1 所以最后一位被丢弃并且它变成0000101 ?这种理解是否正确?

最佳答案

看来您对轮类的工作方式有误解。

移位不会添加零的左边或右边。你不能只加数字,只有这么多位。让我们取你的数字,十进制数 11。

int n = 11; which is 1011

这是事实,但只说明了一半。看,数字在你的 CPU 中有一个固定的大小。对于整数,那是 32 位,但为了更容易,让我们假设 8 位数字。你的 11 看起来像这样:

+-+-+-+-+-+-+-+-+
|0|0|0|0|1|0|1|1|
+-+-+-+-+-+-+-+-+

它有 8 位。总是。现在让我们左移 1:

 +-+-+-+-+-+-+-+-+
0|0|0|0|1|0|1|1| |
+-+-+-+-+-+-+-+-+

移位后,第一位被“移出”。没有空间存储该位。还有,最后一位是“空”,我们不能存储“空”。只有一个或零个。相反,我们“移入”零。所以你最终得到了

+-+-+-+-+-+-+-+-+
|0|0|0|1|0|1|1|0|
+-+-+-+-+-+-+-+-+

右移时相反。我们再次从 11 开始:

+-+-+-+-+-+-+-+-+
|0|0|0|0|1|0|1|1|
+-+-+-+-+-+-+-+-+

然后右移1:

+-+-+-+-+-+-+-+-+
| |0|0|0|0|1|0|1|1
+-+-+-+-+-+-+-+-+

再次,每一位都右移 1。左边有一个空位,如前所述,它刚好变为零。在右边,一个被移出,没有空间存放它。它只是丢失了。我们的最终数字是:

+-+-+-+-+-+-+-+-+
|0|0|0|0|0|1|0|1|
+-+-+-+-+-+-+-+-+

以上适用于无符号数,也称为逻辑右移。在二进制补码系统中,对于有符号数,它使用所谓的算术右移,它不是移入零位,而是移入符号位。 IE。如果数字为负,则最高有效位为 1,则移 1,否则移 0。

关于c++ - 了解带移位的右移运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55203804/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com