[英]Minus operator used as unary bitwise operation
我不完全理解“ - ”运算符如何影响以下代码:
#define COMP(x) ((x) & -(x))
unsigned short a = 0xA55A;
unsigned short b = 0x0400;
有人可以解释COMP(a)和COMP(b)是什么以及如何计算它们?
(x) & -(x)
等于使用2的补码表示二进制数时在x
设置的最低位。
这意味着COMP(a) == 0x0002;
和COMP(b) == 0x0400;
“ - ”符号以二进制补码的方式将短参数的值否定。 (简而言之,将全0转为1,将1转为0然后再加1)
所以二进制的0xA55A是1010 0101 0101 1010
然后 - 二进制的(0xA55A)是0101 1010 1010 0110
运行&
他们之间将会给你0000 0000 0000 0010
-(x)
否定x
。 二进制补码中的否定与~x+1
(bitflip + 1)相同,如下面的代码所示:
#include <stdio.h>
#include <stdio.h>
#include <stdint.h>
int prbits(uintmax_t X, int N /*how many bits to print (from the low end)*/)
{
int n=0;
uintmax_t shift=(uintmax_t)1<<(N-1);
for(;shift;n++,shift>>=1) putchar( (X&shift)?'1':'0');
return n;
}
int main()
{
prbits(0xA55A,16),puts("");
//1010010101011010
prbits(~0xA55A,16),puts("");
//0101101010100101
prbits(~0xA55A+1,16),puts("");
//0101101010100110
prbits(-0xA55A,16),puts("");
//0101101010100110 (same)
}
当你使用bitfliped值对某个值进行bit和bit时,得到0.当你使用bitfliped值+ 1(=其否定值)对某个值进行位操作时,你会得到右边的第一个非零位。
为什么? 如果~x
的最右边的位是1,则向其添加1将产生0
其中carry=1
。 在最右边的位为1时重复此操作,并将这些位置零。 一旦你达到零(在x
为1
,因为你将1加到~x
),它会随着carry == 0变成1,所以加法结束。 在右边你有零,在左边你有点翻转。 你和原版一起咬了这个,你从右边得到第一个非零位。
基本上,COMP所做的是AND两个操作数,其中一个是原始形式,其中一个是对它形式的否定。
CPU通常如何处理带符号的数字是使用2的补码 ,2的补码将数值数据类型的范围拆分为2,其中(2 ^ n-1)-1为正,(2 ^ n-1)为负。
MSB(最右边的位)表示数字数据的符号
例如
0111 -> +7
0110 -> +6
0000 -> +0
1111 -> -1
1110 -> -2
1100 -> -6
因此COMP通过对数字数据的正负版本执行AND来获得第一个1的LSB(最左边的位)。
我写了一些示例代码,可以帮助您理解: http : //coliru.stacked-crooked.com/a/935c3452b31ba76c
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.