码迷,mamicode.com
首页 > 编程语言 > 详细

C++位运算

时间:2016-02-26 09:21:03      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

     最近在学习的时候发现一个以前学过的问题,当时没有系统的整理过,现在遇到就整理到这里来;

    一.什么是位?

    位是一种计算机的储存单位,我们都知道计算机二进制的系统,所以每个二进制中的1或0就叫做位,记做bit,也称比特;

8bit=1byte(字节);

    二.位操作种类

      1.与运算“&”;

       双目运算,两真为真,其他全假;即:

        1&1=1 ;

        1&0=0;

        0&1=0;

        0&0=0;

用途:

       检查指定位上是否置位(为1)

例如:我们检查9的最后一位是不是置位;

9的二进制是1001;那么9&1=1;因为:

1001—>9

0001 —>1

------------

00001 —>1

2.或运算(|)

双目运算,两位全是0时为0,其他为1;即:

1|1=1;

1|0=1;

0|1=1;

0|0=0;

3.异或(^)

双目运算,两位不相等时为1;即:

1^1=0;

1^0=1;

0^1=1;

0^0=0;

4.非运算(~)

单目运算,位值取反;

~1=0;

~0=1;

5.移位运算(<<, >>, >>>)

"m<<n"左移运算,m的左边n位移走,右边补上n个0;

9<<2--------0100

“m>>n”右移运算,区分该数是否是有符号数,如果是无符号将最右边n位移走,左边补上n位的0;

如果是有符号, 将最右边n位移走,左边补上第一位为1,其他为0;

9>>2----------0010

三.位运算的技巧;

1.计算一个二进制中的‘1’的个数;

例如判断9(1001)的二进制‘1’的个数;

1,1001&0001=0001

2,0001不等于0,计数器加一次;

3,1<<1=0010;

4,0010&1001=0000(等于0,跳过第二步,执行第三步);

5,0100&1001=0000(等于0,跳过第二步,执行第三步);

6,1000&1000=10000 不等于0,计数器加一次;

7,左移为0,结束;

还有一种方法就是,一个数减1的得到的数的二进制的最右边的1变为0,这个1右边的0变1;重复计算n&(n-1)直到n为0;

 

2,判断一个数是不是2的n次方;

如果是二的n次方第一位为1,其他为0;

那么n&(n-1)==0;

 

3,判断一个数是不是偶数;

一个数是偶数最后一位是0,否则为1;即:

    n&1==1

 

4.交换两个数,不借助第三个数;

a=a^b;

b=b^a;

a=a^b;

 

5,求一个数的绝对值;

一个数如果是有符号数,那么它的第一位就是符号位,只要右移到第一位,判断是1为负,0为正;

 

 6,求两个数的平均值;

     (1).(m+n)>>1

     (2).((m^n)>>1)+(m&n);

第一次写博客,如果有错还请各位指出;

 

C++位运算

标签:

原文地址:http://www.cnblogs.com/Gooa/p/5219232.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!