逻辑运算符(位运算符)

一、逻辑运算符(位运算符)

符号运算符参与运算的数的形式
|按位或有1则1
&按位与有0则0
^按位亦或相同为0,不同为1
~按位取反1变0,0变1
<<左移各二进位全部左移指定的位数,高位丢弃,低位补0(相当于×2^(位数))
>>右移各二进位全部右移指定的位数,低位丢弃,正数高位补0,负数高位补1(相当于÷2^(位数))

位运算符将数字转化成二进制数的补码来进行运算。

注意:这是有符号位的二进制数,符号位是第一位二进制数(最左边的),符号位为1表示负数,符号位为0表示正数。

原码、补码、反码、移码:https://blog.csdn.net/sandalphon4869/article/details/89395749#1_80

int a=4,b=8;
//4为0100,8为1000

cout<<(a|b)<<endl;
//按位或:0000 0100 | 0000 1000为0000 1100 ,即12

cout<<(a&b)<<endl;
//按位与:0000 0100 & 0000 1000为0000 0000 ,即0

cout<<(a^b)<<endl;
//按位亦或:0000 0100 ^ 0000 1000为0000 1100 ,即12

cout<<(~b)<<endl;
//按位取反:~0000 1000为1111 0111 (补码),补码1111 0111的原码是1000 1001(1111 0111减1得1111 0110,然后除符号位都取反),即-9

cout<<(a<<2)<<endl;
//左移:a左移两位,0000 0100左移两位是0001 0000,即16

cout<<(b>>2)<<endl;
//正数右移:右移两位,0000 1000右移两位是0000 0010(补)→0000 0010(原)即2

cout<<(-10>>1)<<endl;
//负数右移:右移一位,1111 0110右移一位是1111 1011(补)→1000 0101(原)即-5

二、实际应用

2.按位与&

获取指定位数

获取四位二进制数:
a      0101 1010
b      0000 1111
a&b    0000 1010

奇偶检验:k&1

  • k&1为0是偶数
  • k&1为1是奇数

原理:
*二进制数的规律:如果一个二进制数(整型)数的第零位的值是1,那么这个数就是奇数;而如果该位是0,那么这个数就是偶数。*所以获取第零位就知道其奇偶性。

int a=30,b=41;
cout<<(a&1)<<endl;  //0
cout<<(b&1)<<endl;  //1

3.按位亦或^

0^k=k

int a=10;
cout<<(a^0)<<endl;
//10是0000 1010,0是0000 0000,a^0=0000 1010,即10

连续按位亦或2次,得原数

int x=5,y=8;
x^=y;
cout<<x<<endl;	//13
x^=y;
cout<<x<<endl;	//5

a和b交换

int a=30,b=4;

a^=b;
cout<<a<<" "<<b<<endl;
//26 4

b^=a;
cout<<a<<" "<<b<<endl;
//此时的b,相当于a连续按位亦或两次(b^=a即b=b^a=b^(a^b)=a)
//26 30

a^=b;
cout<<a<<" "<<b<<endl; 
//4 30
//此时对a,相当于b连续按位亦或两次(a^=b即a=a^b=(a^b)^(a)=b)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值