我遇到了一些适用于我的应用程序的示例代码,但我不确定在IF语句中实际发生了什么。
unsigned int steps;
uint16_t selected_steps;
for (int j = 16; j>=0; j--)
{
if (((selected_steps^(1 << step_number))>>j) & 0x1) {
some code...
} else {
other code...
}
我知道代码的目的,就是检查selected_steps [j] XOR step_number的位是1还是0.Selected_steps [j]是0还是1.步数取0到15之间的值。
但我不明白实际做了什么
(1 << step_number)
然后做了什么
selected_steps^(1 << step_number)) >> j
我想上面的语句输出1或0,因为它检查0x1?
考虑如果step_number
与j
不同会发生什么。然后:((selected_steps^(1 << step_number))>>j) & 0x1
这样做:
1 << step_number
之外,与selected_steps
的XOR改变了一些j
。但是,正如我们将要看到的,我们并不关心这一点。>>j
将位j
移动到位置0。& 0x1
隔离了那一点。另一方面,如果j
等于selected_steps
,则XOR改变位step_number
,如果j
中的位j
为假,则结果为真。
所以表达式相当于j
。
把它分解成几步。
selected_steps
例如,当:
(step_number == j) != (selected_steps >> j & 1)
然后:
uint16_t mask = 1 << step_number ; // A bit mask with single
// bit `step_number` set.
uint16_t xor_step = selected_steps ^ mask ; // Toggle bit `step_number`.
uint16_t bit_j = (xor_step >> j) & 0x1 ; // Get the single bit `j`
if( bit_j ) ... // If bit j is not zero.
因此,在selected_steps == 0x5AA5 (binary:0101101010100101)
j == 5
step_number == 10
被切换之后,你最终会得到mask = 1 << 10 (Binary: 0000001000000000)
selected_steps: 0101101010100101
mask: 0000001000000000
-----------------------
XOR: 0101100010100101 == xor_step
^
|_ Toggled bit
,- Bit 5 (j)
V
xor_step: 0101100010100101
shift right 5: >>>>>01011000101
^
|_ Bit 5 moved to LSB
0000001011000101
AND 1: 0000000000000001 == bit j
位j
。如果selected_steps
然后切换对结果没有影响。
鉴于您的代码侵略性过高,如何实现您的应用程序的目的是不可能的。据推测,实际上step_number
和j != step_number
不是循环不变的(并且selected_steps
没有未使用,而且step_number
实际上已经初始化了)?