使用bitshift操作产生奇怪的结果

MaS*_*Smi 5 c

我试图更好地理解bishift操作,所以我写了一个小程序.

unsigned char a = 240;
a= (a << 3) >> 7;
printf("a: %u\n",a);
Run Code Online (Sandbox Code Playgroud)

现在我想象结果将是这样的:

11110000 // 240
10000000 // << 3
00000001 // >> 7
Run Code Online (Sandbox Code Playgroud)

所以1,但我得到15.我很困惑...任何帮助表示赞赏!

Fai*_*Dev 9

你的问题是这句话:(a << 3)将输入转换为int.所以在这一点上你有240 * 2 ^ 3 = 1920

00000000000000000000011110000000
Run Code Online (Sandbox Code Playgroud)

然后你将之前的结果除以2 ^ 7 = 128你有:15

00000000000000000000000000001111
Run Code Online (Sandbox Code Playgroud)

这正是你得到的结果.

如果你想截断你可以使用的位:

printf("a: %u\n",a & 1); //get only last bit so you would have 1 as a result!
printf("a: %u\n",a & 255); //get all 8 bits
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!