编写函数invert(x, p, n);将x中从p位置开始向n位置的(二进制)求反,其余位置不变。
/*
* 获取 x 从 p 位置开始向右 n 位置的二进制数
*/
unsigned getbits(unsigned x, int p, int n){
int a = x >> (p - n);
printf("\n对%d右移%d位 结果%d", x, (p -n), a);
int b = ~(~0 << n);
printf("\n用于按位与的值%d", b);
int c = a & b;
printf("\nrequest= %d", c);
return c;
}
void invert(unsigned x, int p, int n){
printf("\n将%d中从%d位置开始向%d位置的(二进制)求反,其余位置不变", x, p, n);
int interval = getbits(x, p, n);
int rest = x & ~(~0 << (p - n));
printf("\n剩余位数的值rest= %d", rest);
int unInterval = ~ interval ^ (~0 << n);// 11111001 ^ 11111000 = 1
printf("\n对区间内的值%d取反,与对~0向左移%d位的结果求按位异或结果unInterval= %d", interval, n, unInterval);
int andRest = unInterval<< (p-n) | rest;
printf("\n取反后的值与剩余的值按位或【|】andRest= %d", andRest);
int value = x >> p << p | andRest;
printf("\n对原始值先左后右移动 %d 位,再与andRest求按位或【|】打印结果值value= %d", p ,value);
}
void mian
{
invert(77, 4, 3);
}
77 的二进制展现形式 1001101
截取到的二进制位 interval = 00000110
剩余位 rest = 00000001
~ interval ^ (~0 << n) 目的是对取到的二进制位进行取反,为了保证其他位不变,则需要用其他位置是1需要取反的值设置为0,再与截取到的二进制位取反进行异或操作。
二进制位取反后的值 unInterval = 00000001;
数据拼装:
【andRest = unInterval<< (p-n) | rest】 将得到取反后的值左移 p-n 位 这里是1位【00000010】,并按位或【可以直接相加这里主要是用位运算符所以用 | 】得到结果【00000011】。
【x >> p << p | andRest】 对原始值进行先左后右位移p 然后再与上次得到的结果按位或。
最后结果 65 二进制展现形式 1000011