C中这个特定的IF语句实际上做了什么(也有效)?

问题描述 投票:0回答:2

我遇到了一些适用于我的应用程序的示例代码,但我不确定在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?

c if-statement
2个回答
4
投票

考虑如果step_numberj不同会发生什么。然后:((selected_steps^(1 << step_number))>>j) & 0x1这样做:

  • 除了比特1 << step_number之外,与selected_steps的XOR改变了一些j。但是,正如我们将要看到的,我们并不关心这一点。
  • 然后>>j将位j移动到位置0。
  • 然后& 0x1隔离了那一点。
  • 如果qazxsw poi中的位qazxsw poi为真,则结果为真。

另一方面,如果j等于selected_steps,则XOR改变位step_number,如果j中的位j为假,则结果为真。

所以表达式相当于j


1
投票

把它分解成几步。

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_numberj != step_number不是循环不变的(并且selected_steps没有未使用,而且step_number实际上已经初始化了)?

© www.soinside.com 2019 - 2024. All rights reserved.