【问题标题】:Bitwise operation bit check位运算位检查
【发布时间】:2015-05-25 14:03:54
【问题描述】:

这是检查是否在某个变量中设置了位并将它们存储在另一个变量中的正确方法吗?忽略变量名,image[]和mask变量都是1字节,first_hline_first_row和second_hline_first_row是2字节。

 for(i=0; i<16; i++){

    if(image[i] & mask1)         first_hline_first_row    |=   (1<<i);
    else                         first_hline_first_row    &=~  (0<<i);

    if(image[i] & mask2)         second_hline_first_row   |=   (1<<i);
    else                         second_hline_first_row   &=~  (0<<i);
    }   

【问题讨论】:

  • 这是什么意思:first_hline_first_row &amp;=~ (0&lt;&lt;i);?
  • 移零无效。以及与它进行 OR-ing。与它进行与运算也会产生零。
  • 是用来清位的吗?
  • 它用于不做任何事情。 0&lt;&lt;i = 0, ~0 = 0xFF..., a &amp; 0xFF.. = a.
  • 好的,这是什么? stackoverflow.com/questions/47981/…

标签: c bit-manipulation bitwise-operators bit-shift


【解决方案1】:

两件事:

  • image[i] &amp; mask1 只检查 image[i]mask1 是否至少有一位相同。这是你的意图吗?
  • first_hline_first_row &amp;=~ (0&lt;&lt;i); 什么都不做(~(0&lt;&lt;i) 都是一个)。

从 cmets 我猜这就是你要写的:

for(i=0; i<16; i++){
     if(image[i] & mask1)
     {
         first_hline_first_row    |=   (1<<i);
     }
     else                         
     {
         first_hline_first_row    &=~  (1<<i);
     }

     if(image[i] & mask2)
     {
         second_hline_first_row   |=   (1<<i);
     }
     else
     {
         second_hline_first_row   &=~  (1<<i);
     } 
}

【讨论】:

  • 是的,在 AND 中只检查了一位,我想借助掩码在新变量中设置一些位。
  • 感谢您指出代码中的问题,现在我明白为什么它不起作用了。
  • 我在声明与您声明的代码相同的 for 循环时遇到问题,它的范围从 16 到
  • 附上代码会更方便快捷。
  • 我受不了几天了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多