17.3 Shifts

C/C++的移位操作通过<<和>>实现。 这里有一个例子函数,计算输入变量有多少个位被置为1.

  1. #define IS_SET(flag, bit) ((flag) & (bit))
  2. int f(unsigned int a)
  3. {
  4. int i;
  5. int rt=0;
  6. for (i=0; i<32; i++)
  7. if (IS_SET (a, 1<<i))
  8. rt++;
  9. return rt;
  10. };

在循环中,迭代计数从0到31,1<&lti语句将计数从1到0x80000000。1<<i即1左移n位,将包含32位数字所有可能的bit位。每次移位仅有1位被置1,其它位均为0,IS_SET宏将判断a对应的位是否置1。

17.3 Shifts - 图1

IS_SET宏就是逻辑与(AND)操作,如果对应的位不为1,则返回0。if条件表达式如果不为0,if()将被触发。