标签:
最近在学习的时候发现一个以前学过的问题,当时没有系统的整理过,现在遇到就整理到这里来;
一.什么是位?
位是一种计算机的储存单位,我们都知道计算机二进制的系统,所以每个二进制中的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);
第一次写博客,如果有错还请各位指出;
标签:
原文地址:http://www.cnblogs.com/Gooa/p/5219232.html