第16课-位运算符分析

14次阅读

共计 1129 个字符,预计需要花费 3 分钟才能阅读完成。

位运算符分析
·C 语言中的位运算符

·左移和右移注意点
- 左操作数必须为整数类型
·char 和 short 被隐藏式转换为 int 后进行移位操作
- 右操作数的范围必须为:[0-31]
- 左移运算符 << 将运算符的二进制位左移
·规则:高位丢弃,低位补 0
- 右移运算符 >> 把运算数的二进制位右移
·规则:高位补符号位,低位丢弃(正数补 0,负数补 1)

例子 16-1:

include”stdio.h”

int main()
{

printf("%d\n",3 << 2);    //3 = 二进制 11
printf("%d\n",3 >> 1);
printf("%d\n",-1 >> 1);
printf("%d\n",0x01 << 2 + 3); // 加法的优先级高于左移运算符
printf("%d\n",3 << -1);   //error 超出左移右移的范围

}
输出结果:
12
1
-1
32
0

例子 16-2:交换 a,b 的值三种算法

include “stdio.h”

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;} //a^b 的值相同时,为 0;不同时为 1;(a ^ b)^b

int main()
{

int a = 1;
int b = 2;
printf("a = %d\n",a);
printf("b = %d\n",b);
SWAP3(a , b);
printf("a = %d\n",a);
printf("b = %d\n",b);
return 0;

}
输出结果:
a = 1
b = 2
a = 2
b = 1

例子 16-3-1:

include “stdio.h”

int main()
{

int i = 0;
int j = 0;
int k = 0;
if(++i | ++j & ++k)
{printf("Run here ..\n");
}
printf("i = %d\n",i);
printf("j = %d\n",j);
printf("k = %d\n",k);
return 0;

}
输出结果:
Run here ..
i = 1
j = 1
k = 1
例子 16-3-2:

include “stdio.h”

int main()
{

int i = 0;
int j = 0;
int k = 0;
if(++i || ++j && ++k)
{printf("Run here ..\n");
}
printf("i = %d\n",i);
printf("j = %d\n",j);
printf("k = %d\n",k);
return 0;

}
输出结果:
Run here ..
i = 1
j = 0
k = 0
小结:
·位运算符只能用于整数类型
·左移与右移运算符的右操作数范围必须为[0,31];
·位运算符没有短路规则,所有的操作数均会求值
·位运算的效率高于四则预算和逻辑运算
·运算优先级:四则运算 > 位运算 > 逻辑运算

正文完
 0