我遇到了以下代码片段
if( 0 != ( x ^ 0x1 ) )
encode( x, m );
x ^ 0x1
是什么意思?这是一种标准技术吗?
我遇到了以下代码片段
if( 0 != ( x ^ 0x1 ) )
encode( x, m );
x ^ 0x1
是什么意思?这是一种标准技术吗?
XOR操作(x ^ 0x1
)反转位0。因此该表达式有效地意味着:如果x的第0位为0,或者x的任何其他位为1,则该表达式为真。
相反,如果x == 1,则表达式为假。
因此,这个测试与以下测试相同:
if (x != 1)
因此(可以说)它是不必要的混淆。
^
是按位异或运算符0x1
是十六进制表示中的1
x ^ 0x1
将翻转x
的最后一位(如果您不清楚,可以参考上面链接中的异或真值表)。因此,条件(0 != ( x ^ 0x1 ))
将在x
大于1或x
的最后一位为0时成立。这只留下了x==1
作为条件不成立的值。因此,它等同于
if (x != 1)
顺便说一下,这种简单条件的实现方式真是够糟糕的。千万别这样做。如果你必须编写复杂的代码,请写注释。我请求你了。
x==0
;4 ^ 0x1
为真,但 4==0
显然是假的。 - Fred Fooif (x == 0)
”, doesn't it equal to x != 1
? “条件似乎等同于 if (x == 0)
”,难道它不等同于 x != 1
吗? - Andrew-Dufresnefloat
/double
зұ»еһӢпјҢжІЎжңүoperator^
иҝҗз®—з¬ҰгҖӮ - fluffy这可能看起来是一个过于简化的解释,但如果有人想慢慢理解,以下是:
^
是 c、c++ 和 c# 中的 位异或 运算符。
位异或操作取两个等长的二进制位模式,并对每一对相应的位执行逻辑异或操作。
异或是一种逻辑操作,当两个输入不同时输出 true(一个为 true,另一个为 false)。
a xor b 的 真值表:
a b a xor b
----------------------------
1 1 0
1 0 1
0 1 1
0 0 0
让我们从二进制层面解释表达式 0 == ( x ^ 0x1 )
:
what? xxxxxxxx (8 bits)
xor 00000001 (hex 0x1 or 0x01, decimal 1)
gives 00000000
---------------------------
the only answer is 00000001
0 == ( x ^ 0x1 ) => x == 1
0 != ( x ^ 0x1 ) => x != 1
这是异或(XOR)运算符。要了解它的工作原理,您可以运行此简单代码
std::cout << "0x0 ^ 0x0 = " << ( 0x0 ^ 0x0 ) << std::endl;
std::cout << "0x0 ^ 0x1 = " << ( 0x0 ^ 0x1 ) << std::endl;
std::cout << "0x1 ^ 0x0 = " << ( 0x1 ^ 0x0 ) << std::endl;
std::cout << "0x1 ^ 0x1 = " << ( 0x1 ^ 0x1 ) << std::endl;
输出将会是
0x0 ^ 0x0 = 0
0x0 ^ 0x1 = 1
0x1 ^ 0x0 = 1
0x1 ^ 0x1 = 0
因此,这个表达式
0 != ( x ^ 0x1 )
只有当x != 0x1时才会等于true。
它不会改变x本身。它仅检查x是否等于0或1。该表达式可以更改为
if ( x != 0x1 )
它检查x
实际上不是0x1
...使用xor
将x
和0x1
异或,只会在x
是0x1
时结果为0...这是一种主要用于汇编语言的老技巧
!= 1
更快吗? - Fiddling Bits^
运算符是按位异或。而 0x1
是数字 1
的十六进制常量表示。
因此,x ^ 0x1
得到的值与 x
相同,但最低有效位取反。
这段代码只是以一种非常复杂和难以理解的方式将 x 与 1 进行比较。
xor(异或)运算符最常用于反转一个或多个位。该操作是询问其中一位是否恰好为1,这导致以下真值表(A和B是输入,Y是输出):
A B Y
0 0 0
0 1 1
1 0 1
1 1 0
现在这段代码的目的似乎是检查最后一位是否为1,其他位是否为0,这相当于 if ( x != 1 )
。
这种模糊的方法之所以被使用可能是之前已经使用了位操作技术,并且可能在程序的其他地方也使用了。
^
是在 c
语言中用于位运算的异或操作符。在你的代码中,x 被异或上了 1。例如,如果 x
的值是 10,那么 10d ^ 1d ===> 1010b ^ 0001b = 1011b, 1011b == 11d
,所以条件成立。
10 != 1010
。 - Fiddling Bits10(十进制)== 1010(二进制)
。 - Paul Rb
或其他标识,那么任何人怎么知道哪些是十进制数,哪些是二进制数呢? - Fiddling Bits^ 操作符是按位异或运算(参见 &, |)。对于一对二进制位,其结果为
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
( x ^ 0x1 )
将x的第0位翻转/反转(其他位不变)。
请考虑x是否可以有除了0x0和0x1之外的值?当x是单个位域时,它只能具有0x0和0x1值,但当x是int(char / short / long /等)时,除了bit0之外的位可能会影响表达式的结果。
给定的表达式允许除了bit0之外的位影响结果,
if ( 0 != ( x ^ 0x1 ) )
if ( x ^ 0x1 )
if( 0x1 & ( x ^ 0x1 ) )
因此,所呈现的表达式实际上是结合了两个表达式检查的结果,
if( ( x & ~0x1 ) //look at all bits besides bit0
|| ( x ^ 0x1 ) ) //combine with the xor expression for bit0
作者是否只想检查位0,并意图使用这个表达式:
if( 0x1 & ( x ^ 0x1 ) )
作者是否有意将bit1-bitN的值与bit0的异或混合在一起?
0 != (x ^ 1)
→ 将两边都异或 1 →(0 ^ 1) != (x ^ 1 ^ 1)
→ 简化 →1 != x
。 - Score_Underif (1 != x)
很难。” - Adriano Varoli Piazzax
的类型未给定 - 因此我们不知道在这个被标记为C++的问题中,它是否是整数。如果这是C语言或者x
是一个整数,那么答案很容易得出,但这并不是必然的,因为有可能对operator ^
进行重载。 - chux - Reinstate Monica