负数与正数的按位与、异或操作


负数的按位与运算: 

按位与运算是按照数据的内部二进制形式进行运算的。

若是两个负数,则是按二进制补码形式进行按位与。

所得结果若用有符号整型变量存储,则内部形式仍看作二进制补码。

如果用格式符%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