本篇文章仅作为了解
位运算
- & 按位与
- | 按位或
- ^ 按位异或
- ~ 取反
- << 左移
- >> 右移
按位与 &
- 一假则假,1真 0假
9 & 5 =
1001
&0101
-------
0001 = 1
按位或 |
- 一真则真
9 | 5 =
1001
&0101
-----
1101 = 13
按位异或 ^
- 不相同为1,相同为0
9 ^ 5 =
1001
|0101
-----
1100 = 12
- 异或的结果和参与运算的顺序没有关系
- 相同的两个数异或 等于0
- 任何一个数异或0的结果还是这个数
- 任何一个数异或同一个数两次,结果不变
取反
- 是单目运算符,作用是对参与运算的二进制位取反,~1 = 0 , ~0 = 1
- 取反运算时对参与运算的数的在内存中存储的补码进行取反
- 想得到真实的值,就需要对取反后的值进行还原
- 先转换成反码,然后转换成原码
左移
- 左移就是将操作数各个二进制位全部左移若干位,高位丢弃,低位补0
- 如果数据较小,被丢弃的高位不包含1,那么左移n位相当于乘以2的n次方
- 左移有可能改变一个数得正负性
右移
- 右移和左移相反
- 右移就是将操作数的各个二进制位全部右移若干位,低位丢弃,高位补0或1,如果最高位是0补0,是1补1
- 如果被丢弃的低位不包含1,那么右移n位相当于除以2的n次方
左移和右移的应用场景,如果想让某一个数乘以2的n次方,或者除以2的n次方,最高效的方法就是左移右移
输出整数的二进制
/**
让value的二进制位向右移31,就可以获得到value的最高位的二进制,然后让value德二进制的最高位和1相&,就可以获得value的最高位
其他位置上的以此类推
此方法输出的是补码,如果是负数,那么还需要转换成原码
*/
void printBinay(int value)
{
//1.定义变量需要向右移动的位数
int offset = 31;
//2.通过循环取出每一位数
while (offset >= 0) {
int result = (value >> offset) & 1;
printf("%i", result);
offset--;
if((offset + 1) %4 == 0){
printf(" ");
}
}
}
判断一个数的奇偶性
if((num & 1) == 1){
printf("奇数\n");
}else{
printf("偶数\n");
}
交换两个变量的值
- 第一种方式
int temp = a;
a = b;
b = temp;
- 第二种方式
a = a + b;
b = a - b;
a = a - b;
- 第三种方式
a = a ^ b;
b = a ^ b;
a = a ^ b;