题干:
给定一个数,将该数的某二进制位上置0、置1或取反。
输入格式:
第1行:输入一个十进制整数。(32位int取值范围,其二进制数补码表示)
第2行后:每行输入一个位操作运算要求。
格式:输入位操作运算类型(1表示置0,
2表示置1
,3表示按位取反
) 位数(从最低位向高位,范围从0~31
)
最终以键盘输入^Z
或 文件结束(EOF标志)。
输出格式:
输出位运算后的整数值。
输入样例:
在这里给出一组输入。例如:
3
1 0
1 1
2 3
3 1
3 2
2 0
输出样例:
在这里给出相应的输出。例如:
15
题解:
这道题涉及位运算的基础操作,置0,置1和取反,下面一一解答
置0:
定义:将数据的某些位设为0。
做法:采用 & 运算、和 ~ 、<<。
将需要置0的位运算对象为0,其余位运算对象为1
例如(将a的第3位置0)
a&=~(1<<3);
置1:
定义:将数据的某些位设为0。
做法:采用 | 运算、和 <<
将需要置1的位运算对象为1,其余位运算对象为0
例如(将a的第3位置1)
a|=(1<<3);
取反:
定义:将数据的某些位0变为1,1变为0。
做法:采用 ^ 运算、和 <<
将需要置1的位运算对象为1,其余位运算对象为0
例如(将a的第5位取反)
a^=(1<<5);
代码如下:
#include<stdio.h>
int main()
{
int n,a,b;
scanf("%d",&n);
while(scanf("%d %d",&a,&b)!=EOF){
switch (a) {
case 1:
n=n&~(1<<b);
break;
case 2:
n=n|(1<<b);
break;
case 3:
n=n^(1<<b);
break;
}
}
printf("%d",n);
return 0;
}
拓展:
如何实现两位及两位以上的置0,置1,取反呢?
采用 | 运算符即可得到两位以上数为1,其余位为0;
例如(将a的第2位和第7位置0,置1,取反)
a&=~((1<<2)|(1<<7));
a|=((1<<2)|(1<<7));
a^=((1<<2)|(1<<7));