您的位置:首页 > 其它

位运算符

2015-08-22 12:02 190 查看

位运算符

& 按位与:一假则假

| 按位或:一真则真

^按位异或:不同则真

多个数异或的结果和异或的顺序无关;

相同整数按位异或结果为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  运算符 位运算