use*_*015 -4 c++ bitwise-operators
我正在尝试解决 codefights 中的问题,浏览网络后,我找到了这个解决方案。但我不清楚它是如何工作的。
a * (a & 1) ^ b * !(b & 1) ^ !!(((a ^ b) + 1) & 2)
Run Code Online (Sandbox Code Playgroud)
Single&是按位 AND,这意味着结果是在运算符左侧和右侧设置的位。
作为示例15 & 7或以二进制表示:
1111
&
0111
Run Code Online (Sandbox Code Playgroud)
按位与将产生具有公共位集的数字:
1111 & 0111 = 0111
Run Code Online (Sandbox Code Playgroud)
当您创建时,(a & 1)您正在测试是否设置了最低有效位(lsb),因为您正在执行如下测试:
a
&
00000001
Run Code Online (Sandbox Code Playgroud)
如果a按位值:00000110,则结果将为 0,因为没有设置公共位;如果按a位值:00000111,则结果将为 1,因为 lsb 设置在 a 上。
这用于不同的情况,如果设置了 lsb,您就知道该数字是奇数,因此此测试实际上是该数字是否为奇数(1、3、5、7,...)。
看看你的解决方案的第一部分:a * (a & 1)你乘以a(0或1记住)的值,如果a是奇数则乘以1,如果是偶数则乘以0。