C++ ^-按位XOR(异或)

示例

int a = 5;     // 0101b(0x05)

int b = 9;     // 1001b(0x09)

int c = a ^ b; // 1100b(0x0C)

std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;

输出结果

a = 5, b = 9, c = 12

为什么

按位XOR(异或)在位级别上操作,并使用以下布尔真值表:

true OR true = false

true OR false = true

false OR false = false

请注意,对于XOR操作,与在操作true OR true = false中一样true AND/OR true = true,因此是XOR操作的排他性。

用这种方法,当二进制值a(0101)和二进制值b(1001)是XOR“编在一起,我们得到的二进制值1100:

int a = 0 1 0 1

int b = 1 0 0 1 ^

        ---------

int c = 1 1 0 0

逐位XOR不会更改原始值的值,除非专门指定使用逐位赋值复合运算符^=:

int a = 5;  // 0101b(0x05)

a ^= 9;    // a = 0101b ^ 1001b

逐位异或可以多种方式使用,并且经常在位掩码操作中用于加密和压缩。

注意:以下示例通常作为一个很好的技巧示例显示。但不应在生产代码中使用(有更好的方法可以达到相同的结果)。std::swap()

您还可以利用XOR操作交换两个变量而无需临时操作:

int a = 42;

int b = 64;

// 异或交换

a ^= b;

b ^= a;

a ^= b;

std::cout << "a = " << a << ", b = " << b << "\n";

要进行正式生产,您需要添加检查以确保可以使用。

void doXORSwap(int& a, int& b)

{

    // 需要添加支票以确保您没有交换相同的内容

    //变量本身。否则它将值归零。

    if (&a != &b)

    {

        // 异或交换

        a ^= b;

        b ^= a;

        a ^= b;

    }

}

因此,尽管它看起来像是一个很好的隔离技巧,但在实际代码中却没有用。xor不是基本逻辑运算,而是其他运算的组合:a ^ c =〜(a&c)&(a | c)

同样在2015年以后的编译器中,变量可能被分配为二进制:

int cn=0b0111;

           

以上是 C++ ^-按位XOR(异或) 的全部内容, 来源链接: utcz.com/z/345207.html

回到顶部