C/C++中位运算操作符的使用

Posted 跋扈洋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++中位运算操作符的使用相关的知识,希望对你有一定的参考价值。

C/C++中位运算操作符的使用

介绍

操作符功能
&位逻辑与
l位逻辑或
^位逻辑异或
~取反运算符

使用

“与”运算符

与运算符的功能是使参与运算的两数各对应的二进制位相“与”,当对应的两个二进制位均为1时,结果为1,否则,均为0。

#include <iostream>
#include <windows.h>
using namespace std;
int main()

    int a=18;   //0001 0010
    int b=23;   //0001 0111
    int c;
    c=a&b;      //0001 0010
    cout<<c<<endl;
    system("pause");
    return 0;



计算过程:
二进制 :十进制
0001 0010 :18
0001 0111 :23
0001 0010 :18
通过上面的运算会发现按位“与”的一个用途是清0.要将原数中为1的位置为0,只需要使其与另一个对应位置为0的数相“与”即可。
比如我们想让1010 1010中的最高位清0,那么我们就可以让他和0111 1111相“与”。

“或”运算符

或运算符“|”的功能是使参与运算的两个数各对应的二进制位相“或”,只要对应的两个二进制位有一个为“1”,结果位就为1。
如果想要将一个二进制位数的某几位设置为1,只需将该数与一个这几位都是1的二进制数执行“或”操作即可。
11010
01110
———
11110

#include <iostream>
#include <windows.h>
using namespace std;
int main()

    int a=18;   //0001 0010
    int b=23;   //0001 0111
    int c;
    c=a|b;      //0001 0111
    cout<<c<<endl;
    system("pause");
    return 0;


“取反操作”

“取反”运算符“~”具有右结合性,其功能是对参与运算的数的各二进制位按位求反。
~01 0101=10 1010
注:对一个数取反并不是对这个数取相反数,即~21不等于-21。
在计算机中,负数以其正值的补码形式表达。
101010=1 10101+1=1 10110=-22

#include <iostream>
#include <windows.h>
using namespace std;
int main()

    int a=21;   
    int b=23;   
    int c;
    c=~a;     
    cout<<c<<endl;
    printf("%x\\n",c);
    system("pause");
    return 0;



“异或”运算符

异或运算符“^”的功能是使参与运算的两数各对应的二进制位相“异或”,当对应的两个二进位数相异时为1,否则结果为0。
“异或”操作的一个主要用途就是能使特定的位翻转,如果要将一个数的后7位翻转只需要与一个后7位都是1的数进行“异或”操作即可。
“异或”操作的另一个主要用途,就是在不使用临时变量的情况下实现两个变量值的互换。
eg:x=21,y=23
x=x^y;
y=y^x;
x=x^y;

#include <iostream>
#include <windows.h>
using namespace std;
int main()

    int a=21;  
    int b=23;   
    cout<<"a="<<a<<"\\n"<<"b="<<b<<endl;
    a=a^b;
    cout<<"a="<<a<<endl;
    b=b^a;
    cout<<"b=="<<b<<endl;
    a=a^b;
    cout<<"a="<<a<<endl;
    system("pause");
    return 0;



"左移"运算符

“左移”运算符“<<”的功能是把“<<”左边的运算数的各二进制位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
实际上左移一位相当于该数乘以2,左移两位相当于乘以4,但这种情况只限于移出位不含1的情况。

#include <iostream>
#include <windows.h>
using namespace std;
int main()

    int a=15;  
    int b=23;   
    cout<<"a="<<a<<"\\n"<<"b="<<b<<endl;
    a=15<<1;
    cout<<"a<<1="<<a<<endl;
    a=15<<2;
    cout<<"a<<2="<<a<<endl;
    a=15<<3;
    cout<<"a<<3="<<a<<endl;
    system("pause");
    return 0;



“右移”运算符

“右移”运算符“>>”的功能是把“>>”左边的运算数的各二进制位全部右移若干位,由“>>”右边的数指定移动的位数。
在进行右移时对于有符号数需要注意符号位问题,当为正数时,最高位补0;当为负数时,最高位是补0还是补1取决于编译系统的规定。移入0的称为“逻辑右移”,移入1的称为“算术右移”。

循环移位

循环移位就是将要移出的低位放到该数的高位或者将移出的高位放到该数的低位。
循环左移的过程如下:

  1. 将x的左端n位先放到z中的低n位中,
    z=x>>(32-n);
  2. 将x左移n位,其右边低n位补0.
    y=x<<n;
  3. 将y与z进行按位“或”运算
    y=y|z;

后续

如果想了解更多物联网、智能家居项目知识,可以关注我的项目实战专栏。
或者关注公众号。

编写不易,感谢支持。

以上是关于C/C++中位运算操作符的使用的主要内容,如果未能解决你的问题,请参考以下文章

如果只需要结果的低位部分,哪些 2 的补码整数运算可以在不将输入中的高位归零的情况下使用?

java中位运算 12>>33 ,应该怎么计算?过程是啥?

C语言 对字节的高位和低位进行互换!

Go语言判断一个字节的高位大于四

实现大小端之间的转换宏,包括32位和64位的数

C/C++中位运算杂谈