二进制知识之位运算,

如果您是一名软件开发的从业人员,并且不知道下面的运算结果的话认真理解这篇文章或许可以帮助到你,本文转载不需要联系作者,也不用注明出处的,能帮助到你,觉得有用的话可以随意收藏转载
echo '~-5=',~-5;
echo '2&3=',2&3;
echo '2|3=',2|3;
echo '-3^3=',-3^3;
echo '-11>>2=',-11>>2;
echo '-17<<3',-17<<3;//-1
#或非与的位运算笔记
二进制,**电子计算机的内部都是用二进制补码的方式运算**(最高位0表正数,1为负数)
1.正数的原码,反码,掩码都是一样的
数字5的源码:00000000 0000000 0000000 00000101 (即1*2的零次方+0*2的一次方+1*22次方)
2、负数的反码=它的原码符号位不变,其他位取反(1->0,0->1)
-1的原码 10000000 00000000 00000000 00000001
-1的反码 11111111 11111111 11111111 11111110
-1的补码 11111111 11111111 11111111 11111111
3、负数的补码(掩码)=它的反码+1
4、正数的三码合一,原码=反码=补码
5、计算机在运算的时候都是以二进制的"补码"来运算的(不管一个数是正数还是负数都是要被转成补码,然后进行运算的)
位运算规范:
$a|$b or (按位或) #把$a或$b中为1的位设置为1
~$a   not(按位非)	#把$a中的0设置为1,1位设置为0
$a&$b and(按位与) #把$a并且$b中都为1的位设置为1
$a^$b and(按位异或) #把$a和$b不同的位数设置为1

$a<<$b and(算术左移)#把$a中的位向左移动$b次,每一次移动都表示"乘以2"
$a>>$b and(算术右移)#把$a中的位向右移动$b次,每一次移动都表示"除以2"
*/
echo "<hr>";#题目13
echo '~2=',~2;
#计算机是用补码(的形式运行的),要求补码先得知道反码,反码可以通过原码得到
#1、2的原码是 00000000 00000000 00000000 00000010 //2是正数,源码=反码=补码,即正2的补码就是这个数
#2、~2执行按位非运算,得到的补码是11111111 11111111 11111111 11111101
#3、因为~2的补码是负数,那么反码等于符号位不变,然后补码减去1
#4、即~2的反码是11111111 11111111 11111111 11111100
#5、知道~2的反码,那么它的源码是符号位不变然后1变0,0变1,取反
#6、得到~2的原码是:10000000 00000000 00000000 00000011
#7、拿到原码了就可以得到结果是负的1*2的0次方+1*2的一次方,结果是-3
echo "<hr>";#题目14
echo '~-5=',~-5;
#1、先找到-5的原码 10000000 00000000 00000000 00000101
#2、-5的反码是    11111111 11111111 11111111 11111010
#3、掩码=反码+1   11111111 11111111 11111111 11111011
#4、~-5按位取反   00000000 00000000 00000000 00000100
#5、0开头说明这个数位正数,则原码=反码=掩码00000000 00000000 00000000 00000100
//答案是答案是1*2的2次方=4
echo "<hr>";
echo '2&3=',2&3;//按位与,也叫同位与,(ps计算机的所有运算都是用反码运算的)
#1、先找到2的原码 00000000 00000000 00000000 00000010(正数,原=反=补)
#2、再找到3的原码 00000000 00000000 00000000 00000011(正数,原=反=补)
#3、2&3同位与    00000000 00000000 00000000 00000010(正数,原=反=补)
#4、答案:1*2的一次方,答案就是2
echo "<hr>";
echo '2|3=',2|3;
#1、先找到2的原码 00000000 00000000 00000000 00000010(正数,原=反=补)
#2、再找到3的原码 00000000 00000000 00000000 00000011(正数,原=反=补)
#3、2&3同位与    00000000 00000000 00000000 00000011(正数,原=反=补)
#4、答案:1*2的0次方+1*2的一次方,答案就是3
echo "<hr>";
echo '4^-2=',4^-2;
#1、先找到4的原码 00000000 00000000 00000000 00000100(正数,原=反=补)
#2、再找到-2的原码10000000 00000000 00000000 00000010(负数,原码)
#3、-2的反码是   11111111 11111111 11111111 11111101(负数,反=符号位不变其他取反)
#3、-2的补码是   11111111 11111111 11111111 11111110(负数,补=符号位不变反码+1)
#4、4^-2按位异或(符号位++/--得正,+-/-+得负,正正得正,负负得正;正负得负,负正得负)
#4、4^-2按位异或(数值位,按为异或,相同的位为0,不同的位为1)
#5、4^-2的补码是: 11111111 11111111 11111111 11111110(看符号位得知这个反码是负数,则求出起反码是)
#5、4^-2的反码是: 11111111 11111111 11111111 11111101(看符号位得知这个反码是负数,则求出起反码是)
#6、4^-2的原码是: 10000000 00000000 00000000 00000010(即负的1*2的一次方=2)
//习题:
echo "<hr>";
echo '7&14=',7&13;//答案是5
echo "<hr>";
echo '5|4=',5|4;//答案是5
echo "<hr>";
echo '-3^3=',-3^3;//答案是-2
#1、先找到-3的原码 10000000 00000000 00000000 00000011(负数原码)
#2、再找到-3的反码 11111111 11111111 11111111 11111100(负数反码)
#3、再找到-3的补码 11111111 11111111 11111111 11111101(负数补码)
#3、3的原码和补码是11111111 11111111 11111111 11111010(负数,反=符号位不变其他取反)
#3、-3的补码是     00000000 00000000 00000000 00000011(正数的原码=反码=补码)
#4、-3^3按位异或   1
//算术右移:>>符号不变,低位溢出并用符号位补高位
//算术左移:<<符号不变,低位补0
echo "<hr>";
echo '11>>2=',11>>2;
#1、先找到11的原码  00000000 00000000 00000000 00001011(正数原码=反码=补码)
#2、算术右移       0??00000 00000000 00000000 00000010(符号位不变,高位用符号位补,低位溢出)
#3、11>>2得到的补码00000000 00000000 00000000 00000010(为正数,那么答案就是2)
echo "<hr>";
echo '-11>>2=',-11>>2;
#1、先找到-11的原码 10000000 00000000 00000000 00001011(负数原码)
#2、再找到-11的反码 11111111 11111111 11111111 11110100(负数反码)
#3、再找到-11的补码 11111111 11111111 11111111 11110101(负数反码)
#4、-11>>2算术右移 1??11111 11111111 11111111 11111101(符号位不变,高位用符号位补,低位溢出)|补码
#4、-11>>2算术右移 11111111 11111111 11111111 11111101(右移两位,计算都是补码哦)
#4、-11>>2反码     11111111 11111111 11111111 11111100
#4、-11>>2原码     10000000 00000000 00000000 00000011(答案是:-3)
//
echo "<hr>";
echo 1<<3;
#1、先找到1的原码  00000000 00000000 00000000 00000001(正数原码=反码=补码)
#2、1<<3算术左移  00000000 00000000 00000000 00001000(补码,这个数是正数,三码合一)
#2、1<<3结果是1*2的三次方=8
echo "<hr>";
echo '-17<<3',-17<<3;//-1
#1、先找到-17的原码 10000000 00000000 00000000 00010001
#2、-17的反码       11111111 11111111 11111111 11101110(反码)
#2、-17的补码       11111111 11111111 11111111 11101111(补码)
#2、-17<<3         11111111 11111111 11111111 01111***(低位补0,补码)
#2、-17<<3         11111111 11111111 11111111 01111000(补码,符号位为1为负数)
#2、-17<<的反码     11111111 11111111 11111111 01110111(反码)
#2、-17<<的原码     10000000 00000000 00000000 10001000(负的{1*2的七次方+1*2的3次方}=-136)

转载随意,不需要联系本人,注不注明出处都无所谓

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值