c - 相反符号按位相加

标签 c bit-manipulation bitwise-operators twos-complement bitwise-xor

int main(){
        int a = 10, b = -2;
        printf("\n %d \n",a^b);
        return 0;
}

该程序输出-12。我不明白怎么办。请解释一下。

0111 1110 -> 2's complement of -2
0000 1010 -> 10
---------
0111 0100

这个 no 似乎大于 -12 并且是 +ve。但我如何得到 -12 的 o/p 呢?

最佳答案

要找到负整数的补码,首先要找到其大小的二进制表示形式。然后翻转其所有位,即应用按位 NOT 运算符 !。然后添加 1 到其中。因此,我们有

2       -->  0000 0000 0000 0010
~2      -->  1111 1111 1111 1101  // flip all the bits
~2 + 1  -->  1111 1111 1111 1110  // add 1

因此,-2的二进制补码二进制表示为

1111 1111 1111 1110

现在,假设int的大小为4,则ab的二进制补码表示为 -

a -->        0000 0000 0000 1010  --> 10
b -->        1111 1111 1111 1110  --> -2
a^b -->      1111 1111 1111 0100  --> -12

运算符^ 是按位XOR 或异或OR 运算符。如果对 ab 的相应位进行运算,并且仅当这些位不都是 0 时,计算结果为 1或两者均为 1,否则计算结果为 0

关于c - 相反符号按位相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23309380/

相关文章:

bit-manipulation - AVX 或其他设置指令可以在给定多个并行整数的索引的情况下提取特定位?

c++:如何将 uint32 中的相关位放入 uint8?

javascript - 按位运算 - 这到底是怎么回事?

c++ - 如何在 C++ 上的 "double"上使用按位运算符?

c++ - while 循环条件中的这个语法是什么?

c - 如何在GCC编译器上的c程序中使用.lib文件方法

c - 分配内存并释放它们。我们应该将它们设置为 NULL 吗?

c - C中的互斥体和线程

c# - 两个左尖括号 "<<"在 C# 中是什么意思?

java - 字节移位逆运算