您现在的位置是:首页 > 学无止境 > 其他网站首页其他 如何快速熟悉二进制的位运算符(&、|、~、^)以及应用范围

如何快速熟悉二进制的位运算符(&、|、~、^)以及应用范围

  • 莫愁
  • 其他
  • 2020-05-23
简介位运算符的计算主要用在二进制中。实际开发中也经常会遇到需要用到这些运算符的时候,同时这些运算符也被作为基础的面试笔试题。所以了解这些运算符对程序员来说是十分必要的。由于位运算都在补码上运行,所以我们还得会补码到反码,反码到原码。反码到原码:加1,逢2进1。
字数 600.5

位运算符的计算主要用在二进制中。实际开发中也经常会遇到需要用到这些运算符的时候,同时这些运算符也被作为基础的面试笔试题。所以了解这些运算符对程序员来说是十分必要的。

位运算

为了方便理解,我将计算机中的1与0进行了类比,类别为开关开灯:有这样两个开关,0为开关关闭,1为开关打开。

下面我就分享我所理解的运算符:

与(&)运算

与运算进行的是这样的算法:

0&0=0,0&1=0,1&0=0,1&1=1

在与运算中两个开关是串联的,如果我们要开灯,需要两个开关都打开灯才会打开。

理解为A与B都打开,则开灯,所以是1&1=1,任意一个开关没打开,都不开灯,所以其他运算都是0。所以通俗理解为A(与)&B都开则开,否则关。

或(|)运算

或运算进行的是这样的算法:

0&0=0,0&1=1,1&0=1,1&1=1

在或运算中两个开关是并联的,即一个开关开,则灯开。如果任意一个开关开了,灯都会亮。只有当两个开关都是关的,灯才不开。通俗理解为A(或)|B任意开则开。

非(~)运算

非运算即取反运算,在二进制中1变0,0变1。由于位运算都在补码上运行,所以我们还得会补码到反码,反码到原码。

补码到反码:符号位不变,其他位按位取反。反码到原码:加1,逢2进1。

如5取~结果为-6。

整数原码、补码、反码都是一样的,所以5的补码是
0000 0101    进行非运算后为
1111 1010    符号位为1是负数,所以要进行转反码操作
1000 0101    接着加1,逢2进1
1000 0110    这时候就是原码了,计算出来就是-6

通过计算可以发现~a=-(a+1)

异或(^)运算

异或运算进行的是这样的算法:

0^0=0,0^1=1,1^0=1,1^1=0

在异或运算中,两个开关相同状态即可灭灯(类似床头开关),异或运算通俗地讲就是一句话:同为假,异为真。

应用范围

与运算-&

Linux中的用户权限的判断

假设一个系统中用户权限分配模块,设置权限为1=>可执行,2=>可写, 4=>可读,如此存储用户的权限,只需要存一个整数合即可,不用存储间隔出的字符串。

  1. 如果用户拥有可执行和可写权限,功能代码为:1+2=3;
  2. 如果用户拥有所有权限,则功能代码为:1+2+4=7;

某用户的权限为6,那么如何判断是否有某权限呢?

  1. 检测用户权限是否拥有可执行权限:6&1 结果为0,表示没有可执行权限。
  2. 检测用户权限是否拥有可读权限:6&4 结果为4,表示拥有可读权限。
是否是二的N次方

如何快速判断一个数是否是二的N次方,可以使用(num-1)&num,因为只要是二的N次方,二进制只能是1+N个0,该数减去1,二进制就是(N-1)个1,与运算就是0。

或运算-|

相同权限判定

权限5和权限3同有的权限是?,5|3=1。所以共同拥有权限1。

异或运算^

交换两值

有A和B,不用另起内存进行交换。

a = a^b;
b = a^b;
a = a^b;

 


转载: 感谢您对莫愁个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源莫愁个人博客 https://www.mochoublog.com/study/405.html”。

文章评论

    • 评论
    人参与,条评论

技术在线

服务时间

周一至周日 12:00-22:00

关闭下雪
关闭背景特效