题目:
编写一个函数invert(x, p, n),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位求反(即1变0,0变1),x的其余各位保持不变。
自我解答:
假设x = 110 101 010,p = 5, n = 3
首先获得第p位开始的n个位的取反值:
先对x取反即~x,这时需要把除~x中除第p到p+1-n的位置0,~x & ((~0 << (p+1-n)) & (~(~0 << (p+1)))),即000 010 000
第二步把x的第p位开始的n个位置0:
可以通过上一步中的~x&之后的表达式取反得到:~((~0 << (p+1-n)) & (~(~0 << (p+1))))
然后在和x求与,即x & ~((~0 << (p+1-n)) & (~(~0 << (p+1))))
即110 000 010
第三步用第一步的值和第二步的值求或:
000 010 000 | 110 000 010 = 110 010 010
代码如下:
#include <stdio.h>
unsigned int invert(unsigned int x, int p, int n)
{
return (~x & ((