Kod*_*ior 183 c c++ bit-manipulation bitmask
我遇到了以下代码段
if( 0 != ( x ^ 0x1 ) )
encode( x, m );
Run Code Online (Sandbox Code Playgroud)
什么x ^ 0x1意思?这是一些标准技术吗?
Pau*_*l R 277
XOR运算(x ^ 0x1)将位0反转.因此表达式实际上意味着:如果x的位0为0,或者x的任何其他位为1,则表达式为真.
相反,如果x == 1,则表达式为false.
因此测试与以下相同:
if (x != 1)
Run Code Online (Sandbox Code Playgroud)
因此(可以说)不必要地混淆了.
Vio*_*ffe 78
^是按位XOR运算0x1是1十六进制表示法x ^ 0x1将反转最后一位x(如果您不清楚,请参阅上面链接中的XOR真值表).因此,(0 != ( x ^ 0x1 ))如果x大于1或者如果最后一位x为0 ,则条件将为真.这仅将x == 1作为条件为假的值.所以它相当于
if (x != 1)
Run Code Online (Sandbox Code Playgroud)
PS地狱的一种方式来实现这样一个简单的条件,我可能会补充说.不要那样做.如果您必须编写复杂的代码,请发表评论.我请求您.
jwa*_*zko 49
这似乎是一个过于简单的解释,但如果有人想慢慢地通过它,它是在下面:
^是c,c ++和c#中的按位XOR运算符.
按位XOR采用相等长度的两个位模式,并对每对相应位执行逻辑异或运算.
异或是一种逻辑运算,只要两个输入不同(一个为真,另一个为假),则输出为真.
该真值表的一个XOR B:
a b a xor b
----------------------------
1 1 0
1 0 1
0 1 1
0 0 0
Run Code Online (Sandbox Code Playgroud)
那么让我们来说明0 == ( x ^ 0x1 )二进制级别的表达式:
what? xxxxxxxx (8 bits)
xor 00000001 (hex 0x1 or 0x01, decimal 1)
gives 00000000
---------------------------
the only answer is 00000001
Run Code Online (Sandbox Code Playgroud)
所以:
0 == ( x ^ 0x1 ) => x == 1
0 != ( x ^ 0x1 ) => x != 1
Run Code Online (Sandbox Code Playgroud)
Vla*_*cow 34
它是异或(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;
Run Code Online (Sandbox Code Playgroud)
输出将是
0x0 ^ 0x0 = 0
0x0 ^ 0x1 = 1
0x1 ^ 0x0 = 1
0x1 ^ 0x1 = 0
Run Code Online (Sandbox Code Playgroud)
所以这个表达
0 != ( x ^ 0x1 )
Run Code Online (Sandbox Code Playgroud)
只有当x!= 0x1时才会相等.
它不会改变x本身.它仅检查x是否等于0或1.此rxpression可以更改为
if ( x != 0x1 )
Run Code Online (Sandbox Code Playgroud)
Fer*_*eak 19
它检查x实际上是不0x1... xor荷兰国际集团x与0x1将导致0只要x是0x1......这是大部分在汇编语言上使用的老把戏
Dav*_*nan 18
该^操作是按位异或运算.并且0x1是数字1,写为十六进制常量.
因此,x ^ 0x1计算一个x与之相同的新值,但是最低有效位会被翻转.
代码只是将x与1进行比较,这是一种非常复杂和模糊的方式.
Pau*_*aul 11
xor(异或)运算符最常用于反转一个或多个位.操作是询问其中一个位是否为1,这导致下面的真值表(A和B是输入,Y是输出):
A B Y
0 0 0
0 1 1
1 0 1
1 1 0
Run Code Online (Sandbox Code Playgroud)
现在这个代码的目的似乎是检查最后一位是否为1,其他位是0,这等于if ( x != 1 ).这种模糊方法的原因可能是先前的位操作技术已被使用,并且可能在程序中的其他位置使用.
^是按位xor operator的c.在你的情况下,x与x进行xor'ed,例如x值为10,那么10d ^ 1d ===> 1010b ^ 0001b = 1011b, 1011b == 11d条件变为true.
小智 8
按位测试似乎是故意的混淆,但如果底层数据是来自IBM大型机系统的公司数据,则可能只是编写代码以反映原始文档.IBM数据格式可以追溯到20世纪60年代,并经常将标志编码为一个字内的单个位以节省存储空间.在修改格式时,在现有记录的末尾添加了标志字节以保持向后兼容性.例如,SMF记录的文档可能会显示汇编语言代码,以测试单个记录中三个不同单词中的三个单独位,以确定数据是输入文件.我对TCP/IP内部的了解要少得多,但你也可以在那里找到位标志.
运算符^是bitwise-xor(参见&,|).位对的结果是,
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
Run Code Online (Sandbox Code Playgroud)
那么表达,
( x ^ 0x1 )
Run Code Online (Sandbox Code Playgroud)
反转/翻转x的第0位(保持其他位不变).
考虑x是否可以具有除0x0和0x1之外的值?当x是单个位字段时,它只能有值0x0和0x1,但是当x是int(char/short/long/etc)时,bit0之外的位会影响表达式的结果.
给定的表达式允许bit0旁边的位影响结果,
if ( 0 != ( x ^ 0x1 ) )
Run Code Online (Sandbox Code Playgroud)
这与(更简单的)表达具有同等的真实性,
if ( x ^ 0x1 )
Run Code Online (Sandbox Code Playgroud)
请注意,此表达式仅检查bit0,
if( 0x1 & ( x ^ 0x1 ) )
Run Code Online (Sandbox Code Playgroud)
所以表达的表达式实际上是两个表达式检查相结合,
if( ( x & ~0x1 ) //look at all bits besides bit0
|| ( x ^ 0x1 ) ) //combine with the xor expression for bit0
Run Code Online (Sandbox Code Playgroud)
作者是否打算只检查bit0,并打算使用这个表达式,
if( 0x1 & ( x ^ 0x1 ) )
Run Code Online (Sandbox Code Playgroud)
或者作者是否打算将bit1-bitN和bit0的xor的值组合在一起?
我正在添加一个新的答案,因为没有人真正解释如何直观地得到答案.
倒数+是-.
倒数^是^.
你是如何解决0 != x - 1的x?你+ 1到双方:0 + 1 != x - 1 + 1→ 1 != x.
你是如何解决0 != x ^ 1的x?你^ 1到双方:0 ^ 1 != x ^ 1 ^ 1→ 1 != x.
我猜测还有其他位或位域值x,这是为了测试只设置低位.在上下文中,我猜这是默认的,因此m可以跳过这个和一些相关的编码(编码可能更昂贵),因为它们必须都是默认值,在构造函数中初始化或类似.
不知何故,解码器必须能够推断出这些值丢失了.如果它们位于某个结构的末尾,则可以通过length始终存在的值进行通信.