解题思路
为了把x从第p位开始的n个位设置成y最右边的n个位,我们首先需要对x中的n个位进行清零,然后对y中的其他位(除最右边的n个位)清零,并将这n个位左移到x对应的n个位上。
对x清零,我们需要让x和一个屏蔽码进行与运算,这个屏蔽码从p位置开始的n个位都是0,其余位都是1,对y同理。
//对x中n个位清零
xxxnnnxxx
111000111
xxx000xxx
//对y的n个位清零
yyyyynnn
0000111
0000nnn
//左移至对应位置
00nnn00
//或运算
xxx000xx
000nnn00
xxxnnnxx
code:
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
return x & ~(~(~0 << n) << (p - n + 1)) |
(y & ~(~0 << n) << (p - n + 1));
}