编程语言中的二进制和位运算符

前段时间自己闲着就学了php,虽说php比较简单,但是在学习的时候还是遇到了许多问题,一些类似底层的知识貌似都不会,例如二进制的一些东西,因此自己又重新好好的学了一遍,这次要分享的是有关二进制的东西和逻辑运算符。一起来学习吧,二进制的知识总结起来一共是7点。

1.二进制的最高位是符号位0表示正数1表示负数

来举个例子,整数3数据的长度为32位,那么用二进制表示就是

0000 0000 0000 0011

如果是-3则表示为

1000 0000 0000 0011

这里其实并不复杂,复杂的是正数和负数的原码、补码、反码,接下来就一点一点的来介绍

2.正数的原码、补码、反码都一样

例如3的原码、补码、反码都是000 0000 0000 0011,一般来说我们先得到数字的原码在得到其他的,这一点也简单,复杂一点的是负数

3.负数的反码等于他的原码符号位不变,其他位取反取反就是0变为1,变为1

以-3为例,它的原码是1000 0000 0000 0011,  -3的反码则是1111 1111 1111 1100

4.负数的补码等于它的反码加1

从第三点我们得到了-3的反码为1111 1111 1111 1100,补码就是1111 1111 1111 1101

5.0的反码补码都是0

6.计算机进行运算的时候,都是以补码的方式进行运算的


有上面5点基础我们就可以不通过程序来做几个题了

(1)取反  ~

就是1变成0,0变成1   那怎么计算 ~3的结果呢?

首先还是要取得3的原码  0000 0000 0000 0011,因为3是正数所以它的补码也是0000 0000 0000 0011,取反后结果则为1111 1111 1111 1100.到了这一步其实我们还没得到最终的结果,此时的1111 1111 1111 1100现在是负数,这样子就要综合第3、4、5、6四条规则来计算了。简单来说其实现在1111 1111 1111 1100是一个补码,负数的补码等于反码加1,那么反码就是补码减去1   ,那怎么算呢在二进制里1+1=10,反过来10-1=1,自然的1111 1111 1111 1100减去1就等于 1111 1111 1111 1011,此时反码出来了,接下来求出原码,负数原码和反码可以通过取反互相转换,那么1111 1111 1111 1011取反就是1000 0000 0000 0100,这个二进制表示的数就是-4

那如果是~(-3)等于多少呢,这个比正数的那种简单了很多,从前面我们知道-3的补码是1111 1111 1111 1101,取反之后结果变为0000 0000 0000 0010,我们的到了一个正数,正数的原码、反码、补码相同,换算成十进制就是2

(2)左移位,将运算数的二进制整体左移制定位数,移动之后的空位用0来补充

例如我们要求-2<<2,原理还是一样先求出-2的补码1111 1111 1111 1110,左移2位之后变为1111 1111 1111 1000,之后求出反码1111 1111 1111 0111,后面再求一次反码得到

1000 0000 0000 1000,最终结果为-8

(3)右移操作,将二进制码整体右移,右移之后的空位用符号位填充

右移的操作和左移类似,这里不再举例了

(4)无符号右移 >>>,这种操作符将会用0来填充空位

 (5)按位与&,按位或|,异或^

   前面2种大家应该都知道,最后一种比较特殊也就是相同为0不同为1 ,例如3&6=2,3|6=7,3^6=5


一般来说记住二进制的那几个规则,后面的这些就没什么问题了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值