强大的位运算

强大的位运算

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 

更多内容:冒泡排序再学习改进冒泡排序(c++)

编译运行环境:dev-c++

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值