这个使用operator ^的C ++代码是什么?

时间:2017-12-28 11:37:06

标签: c++

这段代码是什么意思?

int possible = 1;
for (int i = 0; i < n - 1; ++i){
   possible += (n_size[i] ^ n_size[i + 1]) < 0;
}

我认为这是^ XOR,但它在这段代码中是如何工作的?这很奇怪,

因为我认为当我们使用XOR时我们只有0或1。 请帮助我理解。

2 个答案:

答案 0 :(得分:1)

让我们看看这一行:

possible += (n_size[i] ^ n_size[i + 1]) < 0;

我们不了解n_size,但我认为它是n int的数组。因此,我们对n_size的两个连续项进行XOR(按位),并确定结果的符号(通过将其与0进行比较)。

Bitwise-XOR是每位操作位,因此(ABCD = 1011 ^ 0101&lt; =&gt; A = 1 ^ 0B = 0 ^ 1C = 1 ^ 0D = 1 ^ 1)。< / p>

int以某种方式进行编码,这样我们就可以获得具有最高有效位的符号(数字为0bX???????,如果X = 1,则数字为负数,否则为数字是积极的。)

因此(A ^ B) < 0相当于(A < 0) ^ (B < 0)

当两个连续的词语符号不同时,此行会增加possible

最后,possible计算连续符号的数量。

PS:请注意floatdouble的符号也是由最重要的位确定的,所以如果n_size是{{1}的数组,它的工作原理相同}或float

答案 1 :(得分:0)

由于coderedoc的评论有点简短:^是一个逐位运算符,就像|&一样。在两个变量中,这些运算符应用于每对相应的位(对于这样的一对,你理解的是XOR):

unsigned char c1 =                0b11001010;
unsigned char c2 =                0b10101100;
unsigned char c3 = c1 ^ c2; // == 0b01100110
unsigned char c4 = c1 & c2; // == 0b11101110
unsigned char c5 = c1 | c2; // == 0b10001000