python二进制转为十进制,python怎么把十进制转化为二进制
1正十进制下的原则1.1:5 ^ 7=12
5: 0101
7: 0111
二进制数的和分为三步:
值是相加的,而不是进位值;二进制OR运算计算进位值,二进制AND运算,然后左移一位;对于第1步和第2步的结果,重复上述两步,两个数之和表示不计算进位值加上进位值,直到没有进位。
为什么要把第二部分移到左边?
jjdxtg计算十进制的5 ^ 7时,进位向前一位进1,也就是相当于左移
5的详细计算:
第一次:
或者:0101 0111=0010,不带进位的值。
并且:01010111=0101,等于1的比特表示该比特要被进位。以及进位是要向前进一位,所以要左移,
001,两个位置为1,表示有两个位置需要进位,左移运算,01011=1
第二次:
0010^1010=1000
(00101010)1=0100 #且进位,需要继续添加。
第三次:
1000^0100=1100
(10000100) 1=0000 #无进位
进位0返回第一步的结果。
1.2很多负面博客上的教程都是以正数为例进行讲解,让很多读者误以为是对源代码进行了二元运算。
实际情况用补码算!
因为正源代码,负代码,补码是相等的,大家误以为是用的源代码。
最高位1表示负数,最高位0表示正数在python3中
(个人认为使用补码运算是因为符号位可以直接参与运算)
源码转化成补码:源码转化成反码(符号位1不变,其他位改变),然后反码+1
补码转化为源码:你只需要记住,补码的补码就是源码
所以补码归补码,然后1
例如-2 8
用8位二进制表示:
-2源代码:1000 0010;逆码:1111 1101;补充:1111 1110
8源代码/补码/补码:0000 1000
补码运算的结果如下:
1.1111 1110 0000 1000=1111 0110(负数)转换成源代码:1000 1010=-10。
2.(1111100000 1000) 1=0001 0000(正数),源码和补码相同:0001 0000=16。
这是一个使用补码运算的例子。
继续操作:
进位到16,继续计算1或2步,你会发现你进入了一个无限循环。
因为:python3实现不会溢出,溢出的最高位不会被丢弃。详情请看博文:https://www.jianshu.com/p/21fd1598d4ae。
这个方法在c,c,java里都没有问题。但是python3会有问题,存储的正数是无穷大。
2 python代码python位操作
或者不~或者左右移动。
# -*-编码:utf-8 -*-class解:def Add(self,num1,num2): #在此处写代码如果不是num 1:return num 2 elif not num 2:return num 1 while num 2:num 1,num2=(num1^num2)0xFFFFFFFF,(num 1 num 2)1 if num 131==0:return num 1 else:return num 1-4294967296 why-4294967296?因为2**32=-4294967296。
下面详细解释:
回到前面:
让我们计算二进制中两个数的相加,它是二进制的补数。
如果直接输出是指补码直接转换成十进制(中间不转换成逆码1)。
但是我们最后要输出的是源码的十进制,所以中间少了一步转化成源码的步骤。
前面的计算:1111110 0000 1000=1111 0110(负数)转换成源代码:1000 1010=-10。
111 0110直接转换成十进制是246,想要的结果是-10。
你会发现246-256=-10,这是我们的结果。
为什么要减去256?跟我们的数字8有关系,2**8=256。
在程序中,我们用的是32位,所以减去2**32.
而正数不会有这个问题,因为源码,补码,补码都是相等的。
查了半天资料,终于解决了问题,去吃饭了!
边缘
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。