负数位运算(&,^,|,~)

2023-12-27 16:05:09

本文讨论负数与负数之间,正数与负数之间位运算:

#include <stdio.h>








int main(){
    int a=-3; //1000 0011
    int b=-10;//1000 0101
    int d=10; //0000 1010

    printf("a&b=%d ",a&b); printf("a&d=%d\n",a&d);
    printf("a^b=%d ",a^b); printf("a^d=%d\n",a^d);
    printf("a|b=%d ",a|b); printf("a|d=%d\n",a|d);
    printf("~a=%d ",~a);   printf("~d=%d\n",~d);

    return 0;
}

? ? ? ? ? ? ? ?原码? ? ? ? ? ?反码? ? ? ? ? 补码

a=-3:? 1000 0011, 1111 1100, 1111? 1101;

b=-10:1000 1010, 1111 0101, 1111? 0110;

d=10: 0000 1010, 0000 1010, 0000 1010;

计算机低层运算是补码的运算,所以先计算补码:

a&b:? ?1000 1100?,1111 0011,1111 0100; (-12)

a&d:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0000 1000;(8)?

a^b:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0000 1011; (11) 补码符号位为0,即与反码,补码相同了

a^d:? ?1000 1001, 1111 0110?,1111? 0111;(-9)

a|b:? ? 1000 0001 ,1111 1110, 1111 1111; (-1)

a|d:? ? 1000 0001, 1111 1110, 1111 1111; (-1)

~a:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??0000 0010;(2)

~d:? ? ?0000 1011,1111 0100?, 1111 0101;(11)

注:取反的时候符号位不变,运算的时候符号位要参与运算
?

文章来源:https://blog.csdn.net/weixin_46855342/article/details/135240275
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。