負數的按位與運算:
按位與運算是按照數據的內部二進制形式進行運算的。
若是兩個負數,則是按二進制補碼形式進行按位與。
所得結果若用有符號整型變量存儲,則內部形式仍看作二進制補碼。
如果用格式符%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 }
兩個數互為相反數異或可能有特殊用途,異或后,所剩最低位左移一位。