位运算

来源:互联网 发布:中国水污染地图数据库 编辑:程序博客网 时间:2024/06/03 20:50

位运算

首先,先明确一下一个概念:位运算是通过二进制进行操作的。

首先来认识一下几个位运算的符号。

符号

名称

&

与运算(and

|

或运算(huo

<< 

左移

>> 

右移

~

取反

^

异或

&

    这个就是比较两个二进制数,只有在这两个数的第i位同时是1时,答案的第i位就变成1。也就是说在这一位上,只有两个都是1,答案才能是1

|

    这个或运算有点像&,但是它是只要在第i位上两个数中有1个是1,那么答案就是1.

<<

这个就是把一个数转换成二进制后,整体向左移i位,刚补进来的都为0

>>

    这个有点像>>,不过它是向右移。也就是把一个数转换成二进制后,整体向右移i位。

~

    这个就是在二进制中,把所有1变成0,把所有0变成1

^

    这个就是比较两个二进制数,如果第i位相同,那么答案的第i位就是0,否则就是1

下面就编一个程来更加了解位运算吧!

/*

    ——20158610:34:49

*/

 

#include <iostream>

using namespace std;

 

long long a=7; /*00000111*/

long long b=4; /*00000100*/

 

int main()

{

   cout<<"& :"<<(a&b)<<endl;

/*

   a: 00000111      两数同位1答案1

   b: 00000100

   ______________

      00000100  ------ 4

*/

   cout<<"| :"<<(a|b)<<endl;

/*

   a: 00000111      两数同位有一位1答案1

   b: 00000100

   ______________

      00000111 ------7

*/

   cout<<"<<:"<<(a<<1)<<endl;

/*

   a: 00000111  a<<n

   <==  左移n

   a: 00001110  ------14

*/

  

   cout<<">>:"<<(a>>1)<<endl;

/*

   a: 00000111  a>>n

   ==>  右移n

   a: 00000011  ------3

            注意最后一位的1右移之后就    

*/

   cout<<"~ :"<<(~a)<<endl;

/*

   a: 00000111

   ~a: 11111000 ------  -8 (里是负数是因位也被取反了

            的每一位如果是10,如果是01

   

*/

   cout<<"^ :"<<(a^b)<<endl;

/*

   a: 00000111      两数同位相同时时答案0,否则为 1

   b: 00000100

   ______________

      00000011 ------3

*/

   return 0;

}


运行出来的结果是这样的:

位运算 - 周正华 - 周正华的博客

 

这个也有需要注意的:位运算是在二进制的环境下操作的,而二进制最高位为符号位,即进行位操作时可能会把符号改变了。

 

2 0
原创粉丝点击