簡體   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