C语言 按位运算符

编写函数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 

猜你喜欢

转载自blog.csdn.net/ff_hh/article/details/82986477
今日推荐