正好做状压dp就收集了点c++中位运算与逻辑运算的技巧
参考博客:http://blog.csdn.net/zouliping123/article/details/8995373
http://blog.csdn.net/y990041769/article/details/12977271
左移运算:x << y。将x左移y位,将x最左边的y位丢弃,在右边补y个0。
右移运算:x >> y。将x右移y位,这需要区分x是有符号数还是无符号数。在x是无符号数时,只需将x的最右边的y位丢弃,在左边补上y个0。在x是有符号数时,又分为x是正数还是负数。正数时,同无符号数的处理相同;负数时,将将x的最右边的y位丢弃,在左边补上y个1。
位运算技巧
计算一个数的二进制中1的个数
通过与初始值为1的标志位进行与运算,判断最低位是否为1;然后将标志位左移,判断次低位是否为1;一直这样计算,直到将每一位都判断完毕。
- /*
- 计算一个数的二进制中1的个数
- */
- int countOf1(int num)
- {
- int count = 0;
- unsigned int flag = 1;
- while(flag)
- {
- if(num & flag)
- {
- count++;
- }
- flag = flag << 1;
- }
- return count;
- }
还有一种方法,一个整数减一,可以得到该整数的最右边的1变为0,这个1右边的0变为1。对这个整数和整数减一进行与运算,将该整数的最右边的1变为0,其余位保持不变。直到该整数变为0,进行的与运算的次数即为整数中1的个数。
- /*
- 计算一个数的二进制中1的个数
- */
- int countOf1_2(int num)
- {
- int count = 0;
- while(num)
- {
- num = num & (num - 1);
- count++;
- }
- return count;
- }
判断一个数是否是2的n次方
一个数是2的n次方,则这个数的最高位是1,其余位为0。根据上一题的第二种解法可以很容易得到解决方案。将这个整数与整数减一进行与运算,如果得到的结果为零,可证明该数为2的n次方。
- /*
- 判断一个数是否为2的n次方(一个数为2的n次方,则最高位为1,其余位为0)
- */
- bool is2Power(int num)
- {
- bool flag = true;