繁体   English   中英

减号运算符用作一元按位运算

[英]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时重复此操作,并将这些位置零。 一旦你达到零(在x1 ,因为你将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM