本文共 1405 字,大约阅读时间需要 4 分钟。
C语言的位运算符有~(取反)&(与运算) ^(异或运算) |(或运算) <<(左移) >> (右移),优先级 又高到低 排列为 ~ << >>(左移右移同级) & ^ | 。
其中左移和右移的左操作数只能是整型比如char int 之类的,其中char 和 short 会被提升为 int 型,右操作数的范围为(0~31),超出这个范围会出现不确定的结果。左移是二进制右边补0,右移是无符号二进制左边补零,有符号负数时左边补1,正数左边补0;
一个小问题 0x1 << 2+3 等于几?是5还是32呢?
printf("3 << 1 = %d\n",3<< 1 );//6
printf("3 << -1 = %d\n",3>> -1 );//不确定
printf("-1 << 1 = %d\n",-1 << 1 );//-2
printf("0x1 << 1 = %d\n",0x1<< 2+3 );//??
打印的是32说明+ - 运算符的优先级比<< >> 高。
int i = -1; int k = 1;
printf("k>>30 = %d\n", k >> 30); printf("i >> 30 = %d\n", i >> 30);//有符号数右移是左边补位值不一样。一个用二进制输出数的函数
int count_bit(unsigned a)
{int bit = 0;
while (a) { if (a & 1) { bit++; } a >>= 1; } return bit; }int bits(void)
{ return count_bit(-1);}
void printf_bit(char x)
{ int i; for (i = bits()-1 ;i>=0;i--) { if ((i+1)%4 == 0) { printf(" "); } putchar(((x >> i) & 1) ? '1' : '0'); } }int main()
{ printf_bit(16); system("pause"); return 0; }3种交换两个整数的方法
#define SWAP1(a, b) \
{ \ int t = a; \ a = b; \ b = t; \ }#define SWAP2(a, b) \
{ \ a = a + b; \ b = a - b; \ a = a - b; \ }#define SWAP3(a, b) \
{ \ a = a ^ b; \ b = a ^ b; \ a = a ^ b; \ }2,不要混用数学运算符,位运算符,和逻辑运算符。
#include <stdio.h>
int main()
{ int i = 0; int j = 0; int k = 0; if( ++i | ++j & ++k ) { printf("Run here...\n"); } return 0; }出现的结果不会是你所预期的结果。
防错准则
1:避免数学运算符,位运算符,和逻辑运算符出现在一个表达式中。
2:数学运算符,位运算符,和逻辑运算符出现在一个表达式中是用括号来表达计算次序。
左移和右移运算符的运算效率比数学运算符效率高
左移相当于x2;
右移相当于/2;
学习交流群199546072
转载地址:https://blog.csdn.net/qq_39809601/article/details/81348038 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!