簡體   English   中英

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

[英]How to represent negation using bitwise operators, C

假設您有2個數字:

int x = 1;
int y = 2;

使用按位運算符,我怎么表示xy

比較兩個數字AB的位時,存在三種可能性。 以下假定無符號數字。

  1. A == B :所有位都相同
  2. A > B :兩個數字之間的最高有效位是在A設置的,而不是在B
  3. A < B :兩個數字之間的最高有效位在B設置,而不在A

代碼可能如下所示

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;
}

您需要閱讀二進制補碼算法。 加,減,取反,符號測試以及其他所有操作都由硬件使用按位運算完成,因此您絕對可以在C程序中進行操作。 上面的Wikipedia鏈接應該教會您解決問題所需的一切。

第一步將是僅使用按位運算符實現加法。 之后,一切都應該變得容易。 從小開始-要實現00 + 00、01 + 01等,您需要做什么? 去那邊

您需要從最重要的一端開始檢查,以發現數字是否更大。 此邏輯僅適用於非負整數。

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
}

從左到右比較這些位,尋找最左邊的位。 假設機器為二進制補碼,則最高位確定符號,並且與其他位相比,翻轉的比較意義。 這應該可以在任何兩個的補碼機上工作:

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,等等。您可以看到可以比較兩個負數,就像它們是無符號的一樣。 同樣,兩個非負數也可以比較,就像無符號一樣。 僅當符號不同時,我們才需要考慮它們-但是,如果它們不同,則比較是微不足道的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM