C/C++ 位运算 逻辑运算符和移位运算符

简介

学会位操作在一些情况下可以很好提升程序的效率。
逻辑运算符有 &(与),|(或),~(去反),^(异或)
位移运算符有 <<(左移),>>(右移)
以上除了~都是二目运算符

逻辑运算符

&(与)

&运算:位运算时两边都是1时为1,否则为0
1&1 = 1
1&0 = 0
0&1 = 0
0&0 = 0
应用:&1可以用来判断一个数是奇数还是偶数
因为奇数的的二进制的最后一位必定是1,偶数是0

int型(32位)
8的二进制 :00000000 00000000 00000000 0000100
1的二进制 :00000000 00000000 00000000 0000001
8&1二进制 :00000000 00000000 00000000 0000000

//举例
int a = 8;
if(a&1)
	cout<<"该数是奇数";
else
    cout<<"该数是偶数";
|(或)

|运算:两边有一个1则运算结果为1
1|0=1 0|1=1 1|1=1 0|0=0
或运算可以用来指定某些位为1
比如0001(2)让第三第四位为1只需 | 0110即可

^(异或)

^运算:两边的数不同则为1,否则为0
0^1=1 1^0=1 1^1=0 0^0=0
异或可以用在加密上,比如一个数 a,经过key数加密后即a ^key发送,接收者再将该数与key做异或,a ^key ^key = a。很好理解^ 满足交换律,key ^ key=0,a^0=a。

~(取反)

取反:单目运算符,0取反后为1,1取反后为0

移位运算符

<<(左移):各二进位全部左移若干位,高位丢弃,低位补0
>>(右移):各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

左移和右移的使用方式有很多,合理的使用能很大效虑的减少程序运行的时间,下面举几个简单常用的例子:

当要做一下乘除二的次幂的操作时可以使用
“<<” 左移一位即乘2 比如求m乘2的n次方 m<<n
“>> " 右移一位即除二(逻辑右移时) 比如求m除以2的n次 m>>n
获得int,long等类型最大值,最小值
其实就是当我们知道一个类型它占多少个字节数即可,比如int型4个字节也就是32位,第一位用来表示符号位于是就可以有

int MinInt = 1<<31;
//0x8000 0000 表示的是最小的数(这块是补码的知识,不多余解释)
int MaxInt = ~MinInt;//取反即为最大值

补充
补充一个bitset方便测试
C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。
下面是具体用法
bitset常用构造函数

	bitset<8> bitset1;  //无参构造,长度为8,默认每一位为0

    bitset<8> bitset2(4);  //长度为8,将4以二进制保存,前面用0补充

    string s = "100001";
    bitset<10> bitset3(s);  //长度为10,前面用0补充
    
    char s1[] = "1001";
    bitset<10> bitset4(s1);  //长度为13,前面用0补充
    
    cout << bitset1 << endl;  //00000000
    cout << bitset2 << endl;  //00000100
    cout << bitset3 << endl;  //0000100001
    cout << bitset4 << endl;  //0000001001
    int a = 1<<31;

    cout<<(bitset<32>)a<<endl;
    a = ~a;
    cout<<(bitset<32>)a<<endl;
    cout<<oct<<a<<" "<<hex<<a;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值