知识点:强烈建议仅将位运算符用于处理无符号型。
1.移位运算符(优先级低于算术,高于关系赋值和条件):<<(左移) >>(右移) 左侧运算对象按右侧的要求移动指定位数。右侧运算对象一定不能为负,且必须严格小于结果的位数,否则会未定义。左移时高位丢弃,低位补0。左移n位即是×2的n次方,左移操作比乘法快得多。 而右移高位补的数与原符号位相同,且除2的n次方结果往小取整
2.位求反运算符(~):逐位求反得新值
3. 位与(&) 位或(|)位异或(^):得出运算结果的方法与逻辑运算符类似 位与常用于将某些位置为0而其余位不变,位或常用于将某些位置为1而其余位不变,位异或常用于将某些位取反而其余位不变
题一:
描述
写一个函数使得函数返回值为一个整数,该整数的第i位和m的第i位相同,其他位和n相同
输入
第一行是整数 t,表示测试组数。
每组测试数据包含一行,是三个整数 n, m 和 i (0<=i<=31)
输出
对每组输入数据,每行输出整型变量n变化后的结果
#include <iostream>
using namespace std;
int bitManipulation1(int n, int m, int i)
{ //位或前半部分时使第i位与m第i位相同,后半部分使其他位与n一致
return ((1 << i)&m) | (n&(~(1 << i)));
}
int main()
{
int n, m, i, t;
cin >> t;
while (t--)
{
cin >> n >> m >> i;
cout << bitManipulation1(n, m, i) << endl;
}
return 0;
}
题二:若是与m无关,仅将n第i位取反,其余位与n相同呢?
#include <iostream>
using namespace std;
int bitManipulation2(int n, int i)
{ //位异或是当对应位不相同时为1,相同时为0。则n的第i位跟1位异或结果取反,其余是n与0异或结果不变
return n ^ (1 << i);
}
int main()
{
int t, n, i;
cin >> t;
while (t--)
{
cin >> n >> i;
cout << bitManipulation2(n, i) << endl;
}
return 0;
}
题三:若将n的左边i位都取反,其余位与n相同呢?
仅需将题二中的bitManipulation2函数内语句改为
return n ^ (~0 << (32 - i));