C中的左移位操作

时间:2015-02-03 04:09:25

标签: c bits

我正在尝试移动值为1111的变量'a'并将其移到左侧,这样我就可以得到1110,这意味着它应该打印数字14.然而,它是打印30.我在想因为它正在移动,但它不会占用最多的位(11110),但应该是1110.这是我的代码。谢谢。

int main(int argc, char *argv[]) {
unsigned a;
a=0xF;
a=a<<1; 
printf(": %u\n",a);

4 个答案:

答案 0 :(得分:8)

您的a变量声明为unsigned - 这意味着它是unsigned int,通常有32位。因此,当您将0xF放入其中时,它实际上包含0x0000000F

00000000000000000000000000001111

二进制。

当您将该位置向左移动时,它包含

00000000000000000000000000011110

或十进制30。 (0x1e,十六进制)

如果你想将它限制在4位,你需要在每次移位操作后用{0}结果AND,比如

a = a << 1;
a = a & 0xF;

这将导致a仅包含1110(但实际上包含00000000000000000000000000001110

答案 1 :(得分:2)

首先,unsignedunsigned int的缩写,在大多数现代系统中,int被定义为4个字节(32位)。无论如何,它肯定超过4位。

你是对的&#34;它没有把最多的东西拿出去#34;。

如果您愿意,您可以按&0xF进行匹配0,将最后4位左侧的任何位设置为a = (a << 1) & 0xF;

{{1}}

答案 2 :(得分:1)

当您向左移动一个数字时,最左边的位不会被丢弃,它只会向左移动。因此,当您离开1111时,您将获得11110.为方便起见,您可以记住,无论何时左移一个数字,它乘以2,当您右移时,您实际上将它除以2.只会出现下降如果您指定的位类型用完该数字。在这种情况下,您将获得垃圾值作为答案。所以你的输出在你正在做的事情的背景下是正确的。但是如果你想从15获得14,我建议你使用减法。

答案 3 :(得分:0)

向左移动1111将导致11110,这确实是30.尝试阅读相关问题的这个非常好的答案,我认为你错误地认为了位移。 What are bitwise shift (bit-shift) operators and how do they work?