如何使用按位运算符表示否定,C

时间:2010-09-13 18:44:44

标签: c operators bit-manipulation

假设您有2个数字:

int x = 1;
int y = 2;

使用按位运算符,我如何表示x-y

5 个答案:

答案 0 :(得分:5)

比较两个数字AB的位时,有三个可能性。以下假定无符号数。

  1. A == B:所有位都相同
  2. A > B:这两个号码之间最重要的位置设置在A而不是B
  3. A < B:这两个号码之间最重要的位置设置在B而不是A
  4. 代码可能如下所示

    int getDifType(uint32_t A, uint32_t B)
    {
      uint32_t bitMask = 0x8000000;
      // From MSB to LSB
      for (bitMask = 0x80000000; 0 != bitMask; bitMask >>= 1)
      {
        if (A & bitMask != B & bitMask)
          return (A & bitMask) - (B & bitMask);
      }
      // No difference found
      return 0;
    }
    

答案 1 :(得分:3)

您需要了解two's complement算术。加法,减法,否定,符号测试以及其他所有内容都由硬件使用按位运算完成,因此您绝对可以在C程序中完成。上面的维基百科链接应该教你解决问题所需要知道的一切。

答案 2 :(得分:1)

您的第一步是仅使用按位运算符实现加法。在那之后,一切都应该很容易。从小做起 - 你需要做些什么才能实现00 + 00,01 + 01等?从那里开始。

答案 3 :(得分:1)

您需要从最重要的一端开始检查以查找数字是否更大。该逻辑仅适用于非负整数。

int x,y;
//get x & y
unsigned int mask=1;           // make the mask 000..0001
mask=mask<<(8*sizeoF(int)-1);    // make the mask 1000..000

while(mask!=0)             
{
if(x & mask > y & mask)        
{printf("x greater");break;}
else if(y & mask > x & mask)
{printf("y greater");break;}
mask=mask>>1;                  // shift 1 in mask to the right
}

答案 4 :(得分:1)

比较从左到右的位,寻找不同的最左边的位。假设机器是二进制补码,最高位确定符号,并且将具有与其他位相比的翻转比较感。这适用于任何两个补码机:

int compare(int x, int y) {
  unsigned int mask = ~0U - (~0U >> 1); // select left-most bit
  if (x & mask && ~y & mask)
    return -1; // x < 0 and y >= 0, therefore y > x
  else if (~x & mask && y & mask)
    return 1; // x >= 0 and y < 0, therefore x > y
  for (; mask; mask >>= 1) {
    if (x & mask && ~y & mask)
      return 1;
    else if (~x & mask && y & mask)
      return -1;
  }
  return 0;
}

[请注意,这在技术上不可移植。 C不保证有符号算术将是二进制补码。但是你很难在现代机器上找到行为不同的C实现。]

要了解其工作原理,请考虑首先比较两个无符号数,13d = 1101b和11d = 1011b。 (为了简洁,我假设一个4位字的大小。)最左边的不同位是左边的第二个,前者设置了,而另一个没有。因此前一个数字更大。应该相当清楚,这个原则适用于所有无符号数。

现在,考虑两个补码。你通过补充比特并加一个来否定一个数字。因此,-1d = 1111b,-2d = 1110b,-3d = 1101b,-4d = 1100b等。您可以看到两个负数可以比较,就好像它们是无符号的一样。同样,也可以比较两个非负数,就像无符号一样。只有当这些迹象不同时,我们才能考虑它们 - 但如果它们不同,那么这种比较是微不足道的!