位运算符分析
·C语言中的位运算符
·左移和右移注意点
-左操做数必须为整数类型
·char和short被隐藏式转换为int后进行移位操做
-右操做数的范围必须为:[0-31]
-左移运算符<<将运算符的二进制位左移
·规则:高位丢弃,低位补0
-右移运算符>>把运算数的二进制位右移
·规则:高位补符号位,低位丢弃(正数补0,负数补1)
例子16-1:算法
int main()
{spa
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的值三种算法code
int main()
{blog
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:it
int main()
{io
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:class
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];
·位运算符没有短路规则,全部的操做数均会求值
·位运算的效率高于四则预算和逻辑运算
·运算优先级:四则运算>位运算>逻辑运算二进制