位运算符
- & 按位与:一假则假
- | 按位或:一真则真
- ^按位异或:不同则真
- 多个数异或的结果和异或的顺序无关;
- 相同整数按位异或结果为0;
- 任何正数异或0,结果不变;
- 任何整数按位异或上另一个整数两次,结果不变;
- ~ 按位取反:
- << 左移
a << n 把整数a的二进制位往左边移n位,移出的位丢掉,低位补0, 左移会把原有的数值变大
9 << 1 = 18 9 * 2(1) = 18
9 << 2 = 36 9 * 2(2) = 26
9 << n = 9 * 2(n)
左移的应用场景:当要计算某个数乘以2的n次方的时候就用左移,效率最高
- 注意点:左移有可能改变数值的正负性
右移 >>
a >> n 把整数a的二进制位往右边移n位;移出的位砍掉,缺少的以为最高位是0就补0是1就补1(是在当前操作系统下)
9 >> 1 = 4 9 / 2(1) = 4
9 >> 2 = 2 9 / 2(2) = 2
右移的应用场景:当要计算某个数除以2的N次方的时候就用右移,效率最高案例:要求定义一个函数,传入一个整数,输出该整数的二进制
#include "stdio.h"
void printBinay(int value);
int main() {
/*
0000 0000 0000 0000 0000 0000 0000 1001
&0000 0000 0000 0000 0000 0000 0000 0001
// 1.让9的二进制向右移31,就可以获取到9得最高位的二进制,然后让9的二进制的最高位和1相&,那么就可以获得9的最高位
// 2.让9的二进制向右移30,就可以获得9二进制的第二位
// 3.以此类推, 直到0位置
技巧:
1.任何数与1相&都是那个数
2.利用位移取出每一位
*/
int num = 15;
printBinay(num);
return 0;
}
void printBinay(int value)
{
// 1.定义变量需要向右移动的位数
int offset = 31;
// 2.通过循环取出每一位
while (offset >= 0) {
int result = (value >> offset) & 1;
printf("%i", result);
// 3.每次取出一位就让控制右移的变量-1
offset--;
if ((offset+1) % 4 == 0) {
printf(" ");
}
}
printf("\n");
}
- 案例2:
// 要求交换两个变量的值
#include "stdio.h"
int main() {
int a = 10;
int b = 5;
printf("交换前:a = %i , b = %i\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换前:a = %i , b = %i\n", a, b);
return 0;
}