我看到以下位操作语句,但执行的顺序是什么:
// 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),但是基于它的执行顺序?
答案 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));
age - 1
1U << 1
~2