負數與正數的按位與、異或操作


負數的按位與運算: 

按位與運算是按照數據的內部二進制形式進行運算的。

若是兩個負數,則是按二進制補碼形式進行按位與。

所得結果若用有符號整型變量存儲,則內部形式仍看作二進制補碼。

如果用格式符%d輸出,輸出結果為十進制真值(不應該稱為十進制原碼)。 


例如:

負數與負數:

#include <stdio.h>

main()
{
    short int a = -2, b = -3, c;
    a = -2;             //a的補碼1111 1111 1111 1110
    b = -3;             //b的補碼1111 1111 1111 1101
    c = a & b;          //c的補碼1111 1111 1111 1100
    printf("%hd\n", c); //c的真值-4
}

負數與正數:

#include <stdio.h>
main() { short a = -109; //1111 1111 1001 0011 補碼,原碼 1000 0000 0110 1101 short b = 255; //0000 0000 1111 1111 short c = a & b; //0000 0000 1001 0011 printf("%hd\n", c); //c的真值147 }

兩個數互為相反數位與:

#include <stdio.h>
int main()
{
    short a = 112;          //0000 0000 0111 0000
    short b = -a;           //1111 1111 1001 0000 補碼, 原碼 1000 0000 0111 0000
    short c = a & b;        //0000 0000 0001 0000
    printf("%hd\n", c);     //c的真值16
}

兩個數互為相反數位與操作可有特殊用途,位與所剩恰為最低位。

力扣260題用到:260. 只出現一次的數字 III

負數的異或運算: 

負數的異或操作需要先把數轉換成補碼才行。

例:

負數與正數的異或:

#include <stdio.h>
int main()
{
    short a = 3;            //0000 0000 0000 0011
    short b = -2;           //1111 1111 1111 1110 補碼, 原碼 1000 0000 0000 0010
    short c = a ^ b;        //1111 1111 1111 1101
    printf("%hd\n", c);     //c的真值-3
}

兩個數互為相反數異或:

#include <stdio.h>
int main()
{
    short a = 112;          //0000 0000 0111 0000
    short b = -a;           //1111 1111 1001 0000 補碼, 原碼 1000 0000 0111 0000
    short c = a ^ b;        //1111 1111 1110 0000 補碼, 原碼 1000 0000 0010 0000
    printf("%hd\n", c);     //c的真值-32
}

兩個數互為相反數異或可能有特殊用途,異或后,所剩最低位左移一位。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM