在C中设置位

use*_*523 5 c bit

我正在尝试执行以下操作:

写一个func setbits(x,p.n,y),返回xn位从p设置到最右边n位的位置开始,y其他位保持不变?

我试过这样但没有得到正确的答案.任何人都可以告诉我哪里错了吗?

unsigned setbits(unsigned x,int p,int n,unsigned y)
{
    return (x>>p & (y|(~0<<n)));
}
Run Code Online (Sandbox Code Playgroud)

Ole*_*828 1

Kernighan 和 Ritchie,第二版,练习 2-6。解决方案来自http://users.powernet.co.uk/eton/kandr2/krx206.html

(x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n))