位运算

来源:互联网 发布:淘宝页眉背景图素材 编辑:程序博客网 时间:2024/06/03 16:08


位运算:

1.按位与:a&b

2.按位或:a|b

3.按位异或:a^b

4.按位取反:~a

5.左移:a<<b

6.带符号右移:a>>b

7.无符号右移:a>>>b(Java)C没有这个符号




1.and运算符&


通常用于二进制取位操作,例如:一个数and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制最末位为0的为偶数,为1的为奇数。


boolisEvenNum(num)


{


     return !(num & 1)


}


101101----45


010110----22


----------


000100----4


2.or运算符|


1101101---109


1011001--89


-------


1111101--125


or运算通常用于二进制特定位上的无条件赋值,例如:一个数or1的结果就是把二进制最末位强行变成1,如果需要把二进制最末位变成0,对这个数or1之后再减1就可以了,其实际意义就是把这个数强行转变成最接近的偶数。


1101101


0000001


3.异或运算^


1011011----91


0100101--37


-------


1111110---126


相同为1,不同为0


 


异或运算交换两个数的值


a = a ^b


b = a^b


a = a^b


4.取反运算


b = ~a


5.左移运算


在二进制后面添加n0


左移n


a*(2^n)


6.右移运算


去掉后面n


右移n


a/(2^n)



示例代码:


//@biref 是否是偶数bool isEvenNum(int num){return !(num & 1);}//@biref 转换为最近的偶数,被转换的数可以是偶数,只不过,结果是他自己而已int toEventNum(int num){int result = 0;//需要用括号将“|”运算括起来,不然,结果不对return (num | 1) - 1;}void selfSwap(int &a,int &b){a = a^b;b = a^b;a = a^b;}int main(){//位运算//1.and运算&//计算101101&010110 = 000100int a = 45 & 22;cout << "a=" << a << endl;//2.or运算|for (int i = 0; i < 100;i++){cout << "Num:" << i << ",EvenNum:" << toEventNum(i) << endl;}//3.xor运算^,异或运算int b = 2;int c = 5;cout << "a=" << a << ",b=" << b << endl;selfSwap(a, b);cout << "a=" << a << ",b=" << b << endl;//4.not运算,取反int d = 100;d = ~d;int g = 300;g = ~g;unsigned int e = 100;e = ~e;unsigned int f = 300;f = ~f;cout << "d=" << d << "e=" << e<<",f="<<f<<",g="<<g<<endl;//5.<<运算,左移运算,左移一位,相当于乘以2,//通常认为,左移一位的效率要比乘以2要高,因为,位运算更接近底层。//因此,在程序中用到乘以2^n的操作尽量用左移为运算来操作int h = 5;h = h << 2;//h * 2^n:n是左移的位数,//101101//左移两位//10110100---加两个0cout << "h=" << h << endl;//6.>>运算,右移运算,想办法用右移运算代替出发运算,会使代码效率大大提高int i = 200;i = i >> 2;//i / (2^n)//11001000//右移2位//110010cout << "i=" << i << endl;system("pause");return 0;}


0 0
原创粉丝点击