& in (a & 1) 的目的是什么
What is the purpose of & in (a & 1)
我正在尝试解决codefights中的问题,在浏览网络后,我发现了这个solution.But我不清楚它是如何工作的。
a * (a & 1) ^ b * !(b & 1) ^ !!(((a ^ b) + 1) & 2)
单个&
是按位与,这意味着结果是在运算符左侧和右侧设置的位。
作为示例 15 & 7
或以二进制表示:
1111
&
0111
按位 AND 将产生一个设置了公共位的数字:
1111 & 0111 = 0111
当您进行 (a & 1)
时,您正在测试是否设置了最低有效位 (lsb),因为您正在执行这样的测试:
a
&
00000001
如果 a
的位值:00000110 那么结果将为 0,因为没有设置公共位,如果 a
的位值:00000111 那么结果将为 1因为 lsb 设置在 a.
这个是针对不同的情况使用的,如果设置了lsb就知道这个数是奇数,所以这个测试真的是这个数是不是奇数(1, 3, 5, 7, ...) .
查看您的解决方案的第一部分:a * (a & 1)
您将 a
乘以(记住 0 或 1)的值,如果 a
为奇数,则为 1,如果为 0如果是偶数。
我正在尝试解决codefights中的问题,在浏览网络后,我发现了这个solution.But我不清楚它是如何工作的。
a * (a & 1) ^ b * !(b & 1) ^ !!(((a ^ b) + 1) & 2)
单个&
是按位与,这意味着结果是在运算符左侧和右侧设置的位。
作为示例 15 & 7
或以二进制表示:
1111
&
0111
按位 AND 将产生一个设置了公共位的数字:
1111 & 0111 = 0111
当您进行 (a & 1)
时,您正在测试是否设置了最低有效位 (lsb),因为您正在执行这样的测试:
a
&
00000001
如果 a
的位值:00000110 那么结果将为 0,因为没有设置公共位,如果 a
的位值:00000111 那么结果将为 1因为 lsb 设置在 a.
这个是针对不同的情况使用的,如果设置了lsb就知道这个数是奇数,所以这个测试真的是这个数是不是奇数(1, 3, 5, 7, ...) .
查看您的解决方案的第一部分:a * (a & 1)
您将 a
乘以(记住 0 或 1)的值,如果 a
为奇数,则为 1,如果为 0如果是偶数。