不少代码通过位操作,解题很巧妙,学习语言,就要学其精髓,学其底层,不可蜻蜓点水
例一:
函数getbits(x,p,n),返回x中从右边数第p位开始向右数n位的字段
unsigned getbits(unsigned x,int p,int n)
{
return (x>>(p-n)) & ~(~0<<n) ;
}
(x>>(p-n))把期望获得的字段移到字的最右端;~(~0<<n)建立了最右边n位全为1(其他位均为0)的屏蔽码
例二:
函数setbits(x,p,n,y),返回对x执行以下操作后的结果值:将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变
unsigned setbits(unsigned x,int p,int n,unsigned y)
{
return x & ~(~(~0<<n) << (p-n) ) | ( y & ~(~0<<n) ) << (p-n) ;
}
分析:
设原为:
x: xxx...xnnnx...xxx
y: yyy.............ynnn
若想题意效果,可以:
x变为:xxx...x000x...xxx
y变为:000...0nnn0...000
再x和y做位或
x变为需要,可以:
x