位运算 | 2453 | An Easy Problem
2013-05-13 20:10
369 查看
《编程之美》中2.1 求二进制数中1的个数,就找到这题来做,1AC,可是代码不够优化,看到discuss中牛人的代码,发现M神博客中的解释。
POJ 2453 An Easy Problem
n & -n :计算最右边1的位置:2的n次幂的补还是其本身(不带符号)。例如:101000 & 011000 = 001000
n + x :把右侧连续的1变成1000...的形式。例如:1011100 + 100 = 1100000
n ^ (n + x):取新得到的1和连续的1相连。例如:1011100 ^ 1100000 = 0111100
/ x / 4 :右移两位,再右移x位补差的1到最后的位置上
POJ 2453 An Easy Problem
#include <stdio.h> int main() { int n, x; while (scanf("%d", &n), n) { x = n & -n; printf("%d\n", n + x + (n ^ n + x) / x / 4); } }位运算当中很多应用到了2的n次幂的性质。
n & -n :计算最右边1的位置:2的n次幂的补还是其本身(不带符号)。例如:101000 & 011000 = 001000
n + x :把右侧连续的1变成1000...的形式。例如:1011100 + 100 = 1100000
n ^ (n + x):取新得到的1和连续的1相连。例如:1011100 ^ 1100000 = 0111100
/ x / 4 :右移两位,再右移x位补差的1到最后的位置上
相关文章推荐
- POJ_2453_An Easy Problem(位运算神代码)
- PKU 2453 An Easy Problem
- 【Peking University Online Judge】2453(An Easy Problem)
- [POJ] 2453 An Easy Problem [位运算]
- poj 2453 An Easy Problem
- POJ 2453 An Easy Problem G++
- poj 2453 An Easy Problem
- poj 2453 An Easy Problem
- An Easy Problem?! - POJ 2826
- UESTC - 1597 An easy problem C (线段树)
- HDU5475——An easy problem(线段树or暴力)
- Hdu 2601 An easy Problem
- HDOJ 2055 An easy problem
- POJ2826:An Easy Problem?!——题解(配特殊情况图)
- poj 2826 An Easy Problem?!
- HDU 5475:An easy problem 这题也能用线段树做???
- HDU 5475 An easy problem
- HDOJ 5475 An easy problem
- POJ5475 An easy problem【单点更新】
- POJ 1152 An Easy Problem