强大的位运算
C语言具有高级语言的特点,又具有低级语言的特点.因此它能实现某些高级语言不能实现的功能
位运算是指进行二进制位的运算
运算符 含义
& 按位与
¦ 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
可构成多种复合运算符.
a^b是位运算中异或的意思,相同为0不同为1
a&b是且运算,也是位运算,相同为1不同为0
判断 2 的乘方
递增乘2 O(LogN)
#include<stdio.h>
intmain() {
int a,b = 1;
scanf("%d",&a);
while(b <= a) {
if(a == b) {
printf("OK");
break;
} else b *= 2;
}
printf("NO");
}
移位操作 实现乘2操作O(LogN)
while(b<= a) {
if(a == b) {
printf("OK");
break;
} else b<<=1;//左移乘以2 右移除以2
}
位运算 O(1)
#include<stdio.h>
intmain() {
int a,b = 1;
scanf("%d",&a);
if((a&a-1)==0)
printf("OK");
else printf("NO");
}
交换两个值
以前我们说在交换两个变量的值时都采用中间变量,比如交换a,b的值。
{t=a;a=b;b=t;}.通过异或操作可以不用中间变量。
a=a^b;
b=b^a;
a=a^b;
a= 01 1
(^) b= 1 0 0
a= 11 1
(^) b= 1 0 0
b= 0 1 1
(^) a =1 1 1
a= 10 0
奇偶性的判断
对于二进制表示来说,其最右位为1则该数为奇数,最右位为0则该数为偶数。
#include<stdio.h>
intmain() {
int a;
scanf("%d",&a);
if(a&1)
printf("为奇数");
else
printf("为偶数");
}
求某整数的绝对值
负数:取反加一 (减一后取反)
正数:不变
#include<stdio.h>
intmain() {
int a;
scanf("%d",&a);
if(a<0)
return ~a+1;
return a;
}
附:
C运算符优先级完整口诀
C语言常用运算符的优先级口诀是:“单算关逻条赋逗”;
如果加入位运算符,完整口诀是:“单算移关与,异或逻条赋”。
■“单”表示单目运算符:逻辑非(!),按位取反(~),自增(++),自减(--),取地址(&),取值(*);
■“算”表示算术运算符:乘、除和求余(*,/,%)级别高于加减(+,-);
■“移”表示按位左移(<<)和位右移(>>);
■“关”表示关系运算符:大小关系(>,>=,<,<=)级别高于相等不相等关系(==,!=);
■“与”表示按位与(&);
■“异”表示按位异或(^);
■“或”表示按位或(|);
■“逻”表示逻辑运算符:逻辑与(&&)级别高于逻辑或(||);
■“条”表示条件运算符(? :);
■“赋”表示赋值运算符(=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|=,!=);
◆另,逗号运算符(,) 级别最低,口诀中没有表述,需另加记忆...
版权说明
著作权归作者所有©。
商业转载请联系作者获得授权,非商业转载请注明出处。
本文作者:Joe.Smith
发表日期:2016年11月22日
本文链接:http://blog.csdn.net/qq_26816591/article/details/53291407
来源:CSDN
编译运行环境:dev-c++