以下位操作的执行顺序是什么?

时间:2015-02-03 09:51:05

标签: c bitmap bitwise-operators

我看到以下位操作语句,但执行的顺序是什么:

// Example program
#include <iostream>
#include <string>
#include <stdio.h>

int main()
{
    unsigned int age = 2;
    unsigned int agemap = 0x111 ;
    if(age > 0 && age <= 32)
    {

       agemap &= (unsigned int)~((unsigned int)1 << (unsigned int)(age - 1));
    }
}

这用于从年龄图(0x111)中删除年龄(值2),但是基于它的执行顺序?

2 个答案:

答案 0 :(得分:1)

它当然“基于”C运算符的优先顺序,就像任何其他表达式一样。当然有很多括号,所以你必须考虑到这些。

Wikipedia有一张好桌子。请注意,它很复杂,因为C有很多运算符。

基本上,右侧评估为~(1 << 1),即~2,假设为32位unsigned int,则为0xfffffffd。

答案 1 :(得分:1)

agemap &= (unsigned int)~((unsigned int)1 << (unsigned int)(age - 1));

如果删除(不必要的)强制转换:

agemap &= ~(1U << (age - 1));
  1. age - 1
  2. 1U << 1
  3. ~2