*识别位操作符并且牢记其作用
& | ^以如何有1为记忆点
& 与:补码相同为1则为1,否则为0 // 都为1才1(很难 需要两个1
| 或:补码有1则为1,否则为0 // 有一个1就1(没这么难 只需要一个1 两个1也行
^ 异或:补码相异为1,否则为0 // 不同才1 (很异或 也只需要一个1 但只能有一个1
~ 取反:~(1001)结果为0110
>> 右移:补码右移,缺口补0
<< 左移:补码左移,缺口补0
*按位异或操作符的运用:
Ⅰ:不使用临时变量交换数字如何实现?
例:a=100010;b=000101
a=a^b=100111;
b=a^b=100010;
再a=a^b=100010;a对同一个数进行按位异或运算时候,若有改变数,下一次改变的数一定会与前一次不对应,而造成第二改变,而改变只有0和1两种结果,所以最终对变回原来的那个数。
Ⅱ:两个整数二进制位有几个不同
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int c = 0;
c = a ^ b; //二进制位不同则取1
int tmp = 0;
while (c)
{
tmp++;
c = c & (c - 1); //-1后按位与可以消除一个1 以此来计算1的个数
//因为-1后若个位数没有1 则最小的1会变成0而后面的0会变成1
//如0011 1000会变成0011 0111 然后按位与的规则会得到0011 0000
//即消去了一个1
}
printf("输入的两个数二进制位有%d个不同",tmp);
return 0;
}
富有价值的学习位操作符的题目
* 求两个数二进制中不同位的个数
* 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
* 统计二进制中1的个数
* 交换两个变量(不创建临时变量)