负数的按位与运算:
按位与运算是按照数据的内部二进制形式进行运算的。
若是两个负数,则是按二进制补码形式进行按位与。
所得结果若用有符号整型变量存储,则内部形式仍看作二进制补码。
如果用格式符%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 }
两个数互为相反数异或可能有特殊用途,异或后,所剩最低位左移一位。