精华内容
下载资源
问答
  • 0xffffffff #这个是python里面的,python和别的语言存储负数的格式有点区别 剑指offer例题(应用): 题目: 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 题解python代码: class ...

    实现方法:

    先上操作,python里面的负数直接将其和 0xffffffff 进行 与(&) 操作即可得到其补码:

    def func(n):
    	if n<0:
    		n=n&0xffffffff #这个是python里面的,python和别的语言存储负数的格式有点区别
    

    在这里插入图片描述

    剑指offer例题(应用):

    题目:

    输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

    题解python代码:

    class Solution:
        def NumberOf1(self, n):
            # write code here
            if n<0:
                n=n&0xffffffff #这个是python里面的,python和别的语言存储负数的格式有点区别
            temp=0x00000001
            count=0
            for i in range(64):
                if n&temp:
                    count=count+1
                temp=temp<<1
            return count
    

    以下是 计算补码 原理部分,有兴趣的同学可以看一下:

    ——————————————————————————————————

    存储方式:

    Python 对于负数的存储方式和 c++/c/java 不一样
    1、在 python 里面,负数的存储方式

    a = bin(-3)
    print(a)
     
    a = bin(3)
    print(a)
     
    b = bin(-3 & 0xffffffff)
    print(b)
     
    c = bin(0xfffffffd)
    print(c)
    

    在这里插入图片描述
    也就是说:

    1. Python 中的整型是补码形式存储的
    2. Python 中 bin 一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号
    3. Python 中 bin 一个负数(十六进制表示),输出的是对应的二进制表示。(注意此时)

    所以为了获得负数(十进制表示)的补码,需要手动将其和十六进制数 0xfffffffd 进行按位与操作,得到结果也是个十六进制数,再交给 bin() 进行输出,得到的才是你想要的补码表示。

    2、但是在c/c++/java里面负数都是以补码的形式进行存储的,《计算机原理》显示,计算机内部采用2的补码(Two’s Complement)表示负数。

    3、这就出现了在Python里面需要将负数和0xffffffff进行与操作,来去掉负数前面的负号,可以理解为超过32位的东西就不进行考虑了,这进行与操作的具体步骤是:如果是正数,直接与;如果是负数,先去掉最前面的负号,再取反,再加1,再进行与操作。从而得到负数的补码。

    参考:https://www.runoob.com/w3cnote/python-negative-storage.html

    展开全文
  • 负数以其补码形式表示,符号位为1; 例如-1原码为1000 0000 0000 0001;反码为1111 1111 1111 1110;补码为11111 1111 1111 1111; 此时Python 读11111 1111 1111 1111 转化为10进制就是65535 思路

    问题:PLC 输入-1到16位寄存器/线圈,python 读取显示值为65535,怎么转化为-1呢?

    我们知道正数在内存中原码、反码、补码都是其本身,符号位为0;
    例如1,二进制表示为 0000 0000 0000 0001;
    负数以其补码形式表示,符号位为1;
    例如-1的原码为1000 0000 0000 0001;反码为1111 1111 1111 1110;补码为11111 1111 1111 1111;
    此时Python 读11111 1111 1111 1111 转化为10进制就是65535

    思路:求负数的原码,符号位不变,其余取反后加1;

    例如-1符号位不变,其余取反为1000 0000 0000 0000,加1为1000 0000 0000 0001;
    Python代码如下:

    # ~65535 取反操作,再与0xffff 按位与运算,相当于截取16位,再加1,用负号代表符号位
    print(-(int(~65535&0xffff)+1))
    # 结果为-1
    
    展开全文
  • Python二进制源码补码

    千次阅读 2018-04-25 22:42:57
    假如我计算机是32位,接下来要计算~5值: 5 二进制表达式为:0000 0000 0000 0000 0000 0000 0000 0101 ...知道一个数补码”,其值(“源码”)方法是: 首先看符号位(最左一位),如果是...

    假如我的计算机是32位的,接下来要计算~5的值:

    5 的二进制表达式为:0000 0000 0000 0000 0000 0000 0000 0101
    执行 ~ 运算,即 ~ 5后: 1111 1111 1111 1111 1111 1111 1111 1010,即结果为-6 ?

    计算机普遍使用“补码”表示负数;知道一个数的“补码”,求其值(“源码”)的方法是:
    首先看符号位(最左的一位),如果是1代表是负数(-),如果是0代表是正数(+);
    然后对该值取反再+1,得到其“源码”

    “补码”1111 1111 1111 1111 1111 1111 1111 1010,
    首先,其符号位(最左一位)是1,表明它是负数;
    然后,欲求其“源码”,对“补码”取反再加1:
    0000 0000 0000 0000 0000 0000 0000 0101 + 1 =
    0000 0000 0000 0000 0000 0000 0000 0110
    最后,在得到的“源码”前加一个负号,
    即-0000 0000 0000 0000 0000 0000 0000 0110 = -6

    执行 ~ 运算获得“补码”根据“补码”首位判断正负,再对“补码”取反加1

    >>> aa=5
    >>> ~aa
    -6
    >>> ~aa+1
    -5
    >>> -aa
    -5
    >>> bin(aa)
    '0b101'
    >>> bin(~aa)
    '-0b110'
    >>> bin(~aa+1)
    '-0b101'
    >>> bin(-aa)
    '-0b101'
    

    在这里插入图片描述

    展开全文
  • 补码 正数:原码 负数: Abs(n)+1~Abs(n)+1 Abs(n)+1 实现 假定需要32位补码。正数很好实现,主要是负数。 n=-n n=~n+1 这两步都没有问题,但最后显示是-1。为了修正答案,应该进行一个mask,即 n=n&...

    来源于剑指11,二进制中1的个数。

    补码

    正数:原码
    负数: Abs(n)+1~Abs(n)+1

    实现

    假定需要32位补码。正数很好实现,主要是负数。

    1. n=-n
    2. n=~n+1

    这两步都没有问题,但最后显示的是-1。为了修正答案,应该进行一个mask,即
    n=n&0xffffffff
    完事。

    完整代码

    def NumberOf1(self, n):
        if n>=0:
           a=bin(n)
           count=0
           for i in a:
               if i=="1":
                   count+=1
           return count
        else:
            n=-n
            n=(~n+1)
            print(n)
            n=n&0xffffffff
            print(n)
            a=bin(n)
            return a
    
    展开全文
  • 负数补码表示原码,即符号位不变,其余取反再加1 例如: 7原码为0000 0111 -7原码(即补码)为1111 1001 5原码为0000 0101 -5原码(即补码)为1111 1011 -6原码(即补码)为1111 1000 5:0000 ...
  • 一个有符号定点数的最高位为符号位,0是正,1是副。 以8位整数为例,原码就是这个数本身的二进制形式。 例如 ...负数的反码是将其原码除符号位之外的各位反 ...负数的补码是将其反码在
  • 问题描述: 输入一个整数,输出该数二...根据补码原理我们将其分为求0、求正数、求负数的补码中1的个数; 求出补码之后我们再使用.count("1")来进行数1的个数; 正数直接使用bin()进行求解补码; python中负数的补...
  • 首先,~运算符在python中是按位取反运算,1二进制是 0000 0001,按位取反变为 1111 1110,二进制位中最高位是符号位,1取反之后变成了负数,好,接下来介绍下补码、反码、原码, 计算机中正整数数原码、反码、...
  • python计算一个小数的补码 这篇博客主要讲如何将小数转换为补码形式 文章目录python计算一个小数的补码前言一、补码是什么?二、代码实现1.引入库2.转换正数3.转换负数4.任意数的补码形式5.代码验证总结 前言 ...
  • Python中整数~(按位取反)运算

    千次阅读 2019-08-12 10:53:37
    在计算机中整数用补码表示,非负数的补码是自身的二进制表示,负数的补码是相反数的二进制表示按位取反然后加1 2. python中整数的按位取反运算是先对整数的补码进行按位取反然后再回到整数 例子:~(-6)=5 步骤...
  • 1. 进制转换(Python负数二进制补码) # 转10进制 int('010', 2) # 2进制 int('0x02', 16) # 16进制 # 转2进制 bin(10) # 10进制转二进制,输出'1010' '{:08b}'.format(10) # 8bit二进制,高位补零,...
  • 二进制1个数—python

    2020-02-24 12:00:26
    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 题解1: 从n的2进制形式的最右边开始判断是不是1:n&...正整数的补码不变,负整数的补码为取反加一。 判断是否是正数,否的话和0x...
  • 这个题比lc那道多了一个负数的约束条件,这里负数用补码表示,直接把负数&上0xffffffff就可以得到它的补码,之前我还纠结过这为啥可以得到补码,写了一篇博客。 如果是正数很容易想到就是用整数转二进制的方法...
  • python 位运算

    2018-06-22 18:10:24
    负数的反码是将其源码除符号位之外的各位反,负数的补码是将其源码出符号位之外的各位反后再加1。总结所有来说,就是进行运算的时候是各个数的补码,最后得出来的也是结果的补码。按位运算就把数字转换为机器...
  • 首先,这种基础的求二进制中1个数问题,对于强大的Python,一定存在一些好用库函数。果不其然,代码如下: Python代码1 def NumberOf1(self, n): if n &gt;= 0: return bin(n).count('1...
  • 首先,这种基础的求二进制中1个数问题,对于强大的Python,一定存在一些好用库函数。果不其然,代码如下: Python代码1 def NumberOf1(self, n): if n >= 0: return bin(n).count('1') else...
  • 思路:一种是直接求补码,然后统计1个数;另一种是通过n&(n-1)每次消除最低位1,直至消除至0,所需要消除次数即为1位数。 code: # 第一种 # -*- coding:utf-8 -*- class Solution: def buma(self, n): ...
  • 题目 输入一个整数,输出该数...其中求补码的方法为将其用原码表示,然后从右边第一个为‘1’数起往左依次取反(取反操作即与1异或,0^1=1,1^1=0)。 注意:该题是32位。 代码 # -*- coding:utf-8 -*- cl...
  • 解1:12 二进制:0000 1100补码: 0000 1100按位取反 :1111 0011这个原码,即负数求补码的逆过程:先减1,再取反 (符号位不变)-1 1111 0010取反 1111 1101 还原成十进制-132、10^9等于?10^-9等于?解:(1)10^...
  • 题目描述 输入一个32位整数,输出该数二进制表示中1的个数。 注意: 负数在计算机中用其绝对值...对于负数来说,其补码等于2的32次方减去负数绝对值的二进制表示,也即可将求负数的二进制补码表示转换为求(2^32 +
  • 解1:12 二进制:0000 1100补码: 0000 1100按位取反 :1111 0011这个原码,即负数求补码的逆过程:先减1,再取反 (符号位不变)-1 1111 0010取反 1111 1101 还原成十进制-132、10^9等于?10^-9等于?解:(1)10^...
  • python 取反操作符(~)

    千次阅读 2020-07-29 10:31:26
    负数的补码为符号位不变,剩余位取反再加1 ③原码补码: 取反,+1 ④补码原码: 取反,+1 ⑤负数是以补码存储的 ⑥取反操作是在原码上进行的 ⑦符号位,1表示负数,0表示正数 2、例子 #################### ~(-2...
  • 其中负数补码表示。 记录 方法一: 直接转成二进制数,然后遍历“1”个数。 直接调用count()也可以,思想一样就行。 # -*- coding:utf-8 -*- class Solution: def NumberOf1(self, n): count=0 n = n&0...
  • 0xffffffff 把该数字转化成补码形式,参考查看 【Python 对于负数的存储方式和 c++/c/java 不一样】 关于二进制中 1 的个数的法,有一个小技巧: 一个非 0 的数字至少有一位为1 该数字减去 1 ...
  • #Python3中~ 按位取反运算符

    千次阅读 2018-10-09 11:33:31
    ~ 按位取反运算符 换位取反运算符: A = 5 ~A = -6 A = -5 ~A = 4 所有正整数的按位取反是其本身+1的负数 所有负整数的按位取反是其本身+1的...已知补码,原码的负数的补码:符号位和数值位都取反,末位再加1...
  • python数值取反问题~

    千次阅读 2018-07-04 09:32:28
    python中,用取反符号~得到的并不是我们想象中的结果,总结一下规律,就是 ...二进制以1开头表示的是负数, 所以这个1111 1110到底表示的是什么负值呢,想要知道这个值,可以的补码,即先取反码 :0000 0001...
  • Python学习:位运算

    2020-07-23 15:40:02
    1. 原码、反码和补码 **原码(true form)**是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了...正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。 00 00 00 11 ->

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

python求负数的补码

python 订阅