精华内容
下载资源
问答
  • 一、“取反加一”的新理解 在前面的两篇博文中分别讨论的“取反加一”的两个作用。...提到了:若想求一个负数的补码,则对其绝对值进行“取反加一”即可; 第二个应用:在博文《知道某负数补码后如

     

    一、“取反加一”的新理解

    在前面的两篇博文中分别讨论的“取反加一”的两个作用。(取反加一应该是按位取反加一,下同)

    第一个应用:在博文《如何计算一个有符号数的补码表示?》 (链接http://blog.csdn.net/jbb0523/article/details/6668237

    提到了:若想求一个负数的补码,则对其绝对值进行“取反加一”即可;

    第二个应用:在博文《知道某负数补码后如何计算其绝对值?》(链接http://blog.csdn.net/jbb0523/article/details/6692747

    提到了:基想求一个负数的绝对值,则对其“取反加一”即可;

    什么叫补码?补码就是负数在计算机中的表示。

    在第一个应用中,对负数的绝对值取反加一得到其在计算机中的存储格式,实际上即对正数“取反加一”即可得到与其对应的负数;

    在第二个应用中,对负数取反加一得到其绝对值,实际是即对负数“取反加一”即可得到与其对应的正数;

    综合以上两点,在计算机中,对一个数进行“取反加一”操作,即对其乘“-1”,即得到相反数。

     

    二、在FFT频谱分析后如何获得其频率分量值?

    在博文《有关在matlab中对信号采样及频谱的一些解释;复数的频谱,高分辨率谱,高密度谱的一些理解 》(链接http://blog.csdn.net/jbb0523/article/details/7283847

    提到了一个性质,现重述如下:

    对于信号s(t)=cos(2*pi*f*t)-j*sin(2*pi*f*t),对其进行符合奈奎斯特采样定理的采样,设采样率为fs,采样点数为N,得到数字信号s(n),n=[0,…,N-1],则对s(n)做DFT变换进行谱分析后得到S(k),k=[0,…,N-1]。观察S(k)的幅度谱,若k=0~N/2-1之间有峰值,则s(t)的频率f在-fs/2~0之间;若k=N/2~N-1之间有峰值,则s(t)的频率f在0~fs/2之间;并且有且只有一个峰值。

    计算公式如下:设幅度谱峰值当k=k1时出现,则s(t)的频率为:

     

    现在我们假设场景如下:我们得到了信号s(t),我们要知道它的频率f,我们可以对其进行fft运算,然后按照如上公式进行计算得到f,但是上面的公式是一个分段函数,这会给我们的计算带来一定的复杂性,下面阐述一种较为简单的方法。

    我们假设N=128,用7bit表示;

    那么k1的范围是0~127,如果将k1看成是有符号数,则其范围是0~63和-64~-1;

    若对公式变形如下:

    说到这儿,有一个性质要明白:对于一组使用n bit进行存储数据来说,如果将其当成无符号数来看,那么它的范围是0~2^n-1;但如果将其当成有符号数来看,那么它的范围是-2^(n-1)~2^(n-1)-1,其中0~2^(n-1)-1仍对应0~2^(n-1)-1,但2^(n-1)~2^n-1则对应-2^(n-1)~-1;其实转换关系也可是这样理解,对前一半的数它是不变的,因为它的最高位是0,因此是正数,这个大家都明白,但对于后一半的数,由于最高位是1,则它们是负数,转换关系是signed=unsigned-2^n;

    因此对于N=7来说,它的无符号范围是0~127,而它的有符号范围是-64~63,其中-64~-1对应64~127,即64~127对应64-128~127-128;

     

    如果我们将k1视为一个有符号数,则上面的公式可以变形为:

    因此,实际上f=fs/N*(-k1),这就好办多了,将一个分段函数变成了一个函数表式。

     

    我们若要求频率f,则对信号s(t)进行FFT后,找到峰值对应的位置,将其值视为有符号数,取其相反数,然后乘以fs/N即可,这样做是不是简便了很多了?

     

    今天先分析到这儿,啥时候有了新的体会再继续……

    展开全文
  • 正数的补码是其自身,负数的补码是其绝对值取反加一。 在这里我们不考虑正数,因为正数没有补码,其实是不需要更准确。我们只看负数的补码,这里有两个信息:取反和加一。由这两个信息引出两个问题: 取反是什么...

    我们都知道在计算机中,数字是以补码的形式存储的,好处就是利于减法计算,可是为什么呢?让我们来试图回答以下几个问题。

    1. 什么是补码,如何计算?
    2. 补码如何将减法转化为加法?

    但凡编程入过门,都知道补码是怎么回事。正数的补码是其自身,负数的补码是其绝对值取反加一。

    在这里我们不考虑正数,因为正数没有补码,其实是不需要更准确。我们只看负数的补码,这里有两个信息:取反和加一。由这两个信息引出两个问题:

    1. 取反是什么意思?
    2. 为什么要加1?

    二进制不符合人的直观认知,所以我们在十进制下来看看补码的计算。以15-7为例,用补码计算。

    首先我们假设数字位宽是4位,最高位为符号位,15表示为0015,-7应该是1007。但我们清楚的知道这样计算出来的结果0015+1007=1022是不对的。我们要将-7用补码来表示,这里涉及第一个问题,如何取反?

    在二进制中取反就是0变1,1变0,那么在十进制中取反的含义是什么呢?

    取反的本质是该进制下的极数减去原数。所谓极数就是该进制所能表达的最大数,比如4位十进制所能表达的最大数是9999,那么-7取反就是9999-7=9992。所以,为什么二进制取反是0/1互换呢,因为二进制所能表达的极数是1111,相减的结果当然就是0变1,1变0了。

    知道了如何取反,那么-7的补码就是9992+1=9993,现在在来计算15-7,就变成了0015+9993=10008,但是由于我们只有4位位宽,所以最高位的1会被截断,最终结果变成0008

    看到这里,是不是就觉得补码计算没那么神奇了。我们将计算过程进一步展开:

    157=00150007=0015+99990007+1=00150007+9999+1=00150007+10000=00150007 \begin{aligned} 15-7&=0015-0007\\&=0015+9999-0007+1\\&=0015-0007+9999+1\\&=0015-0007+10000\\&=0015-0007 \end{aligned}

    从上面的过程中我们可以清楚的看到减法是如何变成加法的,以及补码取反之后为什么要加1。现在我们再来审视前面提出的问题,补码把减法变成加法的原理是位宽溢出。我们之所以可以做直接做加法,是因为补码已经帮我们做了一次减法,就是求反码的时候。只不过在二进制中,求补码的减法刚好就是取反!所以,取反的意思其实是做减法

    再次回到文章标题,其实补码并没有将减法转化为加法,而是补码帮你做了减法。

    最后我们再来看看为什么正数没有补码,因为补码中蕴含的是减法运算,而正数代表的是加法运算,负数代表的才是减法运算。


    展开全文
  • 真值 ...也就是该负数的绝对值取反加一,再补一个符号位 原码 用1和0分别代表负数和正数 https://zhidao.baidu.com/question/181720031.html https://www.cnblogs.com/cheyihaosky/p/11552718.html

    真值

    用“+、-”来表示数的正负

    机器数

    机器数是将符号"数字化"的数,是数字在计算机中的二进制表示形式

    用1和0分别代表负数和正数

    补码

    是计算机中存储的数值

    正数的补码是本身
    负数的补码是原码的符号位不变,其余位取反加一。也就是该负数的绝对值取反加一,再补一个符号位

    原码

    用1和0分别代表负数和正数

    参考网址:
    https://zhidao.baidu.com/question/181720031.html
    https://www.cnblogs.com/cheyihaosky/p/11552718.html

    展开全文
  • 题目描述 输入一个整数,输出该数二进制表示中1的个数...首先正数和负数在内存中都是以补码存储的,正数的补码就是它本身,负数的补码是它的绝对值取反加一。关于原码反码补码,详解可看: http://blog.csdn.net/u011

    题目描述
    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

    剑指offer的题做起来真是可以补坑。。。

    这道题一看就是要用位运算来解决了。位运算的需要点计算机组成原理的知识,不然这道题还是有小坑的。

    首先正数和负数在内存中都是以补码存储的,正数的补码就是它本身,负数的补码是它的绝对值取反加一。关于原码反码补码,详解可看:
    http://blog.csdn.net/u011080472/article/details/51280919

    对于无符号数来说,左移1位,相当于乘以一个2,右移一位相当于除以一个2;
    对于有符号数,先说右移:
    普通的右移,都是在左边补0,那么对于一个负数最高位为1,又移后,左边符号位补0,这肯定是不对的,那么可以这样解决:对于有符号数,如果是正数,右移左边补0,如果是负数,右移左边补1,,这样可以解决。
    再说左移,负数的左移要怎么解决呢?右边只能补0,左移后可能导致符号位变了。变了就变了,没有什么特别的,即由负数变成一正数。

    以前就知道Java里面溢出会变成负数,就是因为改变了符号位,再继续左移,对正数而言,最后将变成0.

    讨论区中提到的坑点:
    这里写图片描述

    上面说了这么多,这个一看就懂了吧。

    第一种方法:
    不断的移动1的位置,作位运算,这种方法AC了,但是如果负数的最后一位是不是也算上1了。这里有点题意的争议。
    int count = 0;
    int flag = 1;
    while (flag != 0) {
    if ((n & flag) != 0) {
    count++;
    }
    flag = flag << 1;
    }
    return count;

    最好的方法:

    class Solution {
    public:
       int NumberOf1(int n) {
            int count = 0;
            while(n!= 0){
                count++;
                n = n & (n - 1);
            }
                return count;
        }
    };
    

    n-1后,n的二进制表示的处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。

    eg:
    一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

    有人说负数情况怎么办,位运算无关正负数,仔细想一下就明白了。

    做这道题的时候,我中间用C实现了讲十进制转二进制的方法,(Java里面有printBinary方法)

    void f(int n)
    {
        if(n)
            f(n/2);
        else
            return;
        printf("%d",n%2);
    }

    其实就是利用递归的“延迟”模拟了辗转相除法,递归可以存储过程状态,最后倒置一个过程,倒着遍历存储的状态(前面的倒叙打印链表),刚好模拟了将余数倒置组合即结果的思想。

    展开全文
  • 而对于负数,我们需要对数据位取反加一,然后将数据赋给无符号寄存器。有的时候我们的这个无符号寄存器位数比较大的时候,若数据位负数,可以直接将有符号寄存器直接不考虑符号位取反加一。 如上图,有符号寄存器在...
  • 在计算机的内部,我们...负数的补码为其绝对值取反然后加一得到 例如-7 他在计算机内部的是1111 1001 是这样得到的 7-》111-》0000 0111-》1111 1000-》1111 1001 无符号整数的表示: 在计算机内部用原码表...
  • 补码规则就是用0减去这个数的绝对值取反加一)。首先我们知道x+x(反码)=0xFFFFFFFF, 因此x+x(反码)+1=0, 因此x(补码)=0-x=x(反码)+1。补码的好处就是方便计算机做加法。 2、浮点数类型 C++中的浮点数类型分为...
  • 需要了解的知识 1.原码、补码 2.计算机寄存器和内存进行运算的存储方式 知识点 整型数据在内存中是以二进制的补码形式存放的,且最高位为符号位,1表示...正数的补码是原码,负数的补码是绝对值的原码取反加一 ...
  • 逻辑运算与移位运算

    2012-11-27 14:56:55
    [code="java"]源码:正数的补码与原码相同例+7 源码:00000111 补码 :00000111 (用8位二进制表示一个数) ...[/code] -7 源码: 10000111 ,其绝对值为00000111 取反加一:11111001 为-7补码 ...
  • 用UltraEdit打开,E07F表示数据开始(选择向下搜索),下图是一个CT的dcm,配合ImageJ观察 dcm是big endian,就是30 F8其实表示F8 30 ...(原本应该负数取绝对值,然后取反加一),正数则直接生...
  • 补码、条件跳转指令

    2018-10-14 14:20:00
    负数的补码为取反加一) 12进制时钟: 12 + 1 = 13 = 1 12 - 11 = 1 这里的1和-1就互为补码 计算器将减法运算转换为加法运算简化电路 如果是正数,补码为其本身 如果是负数,补码即为摸减去这个数的绝对值 1 --> 1 .....
  • abs相关

    2019-09-03 11:45:00
    当num为负数且不是最小的负数时(不要问我最小的int类型负数是多少,上面那个图里面有真相),函数返回num的对应绝对值数,即将内存中该二进制位的符号位取反,并把后面数值位取反加一; 当num为最小的负数时(即0x...
  • 关于java中byte

    2015-12-17 11:04:51
    简单介绍: a,1字节==8比特,在计算机中,一个字节,是用8个‘1’和‘0’比特表示的; b,byte的数值范围是从-...d,负数的二进制表示,是通过,负数的绝对值的二进制取反加一获得,即-10—>10—>0000 1010—>1111 0101
  • 补码:用0减去这个数值的绝对值(对应1),也可以表达为对这个数值取反加一(对应2)。 1: -1 对应的是 0xFFFFFFFF (8位) > 0-1= 0X100000000(9位) - 0x000000001(9位)=0xFFFFFFFFF(9位) >因为1个字节是8...
  • 负数:补码是原码除了符号位的每一位取反加一 反码: 正数:反码和原码相同; 负数:反码是原码除了符号位的每一位取反 移码: 移码仅和补码的符号位相反,数值位相同 例: 给定一个数为 -36写出其四种机器数 ...
  • 一眼看懂二进制补码的计算方法

    千次阅读 2017-10-16 23:08:28
    二进制补码的计算方法二进制补码的计算方法最近,我仔细研究了下linux下,C程序的编译和链接过程。反汇编和查看二进制时,难免看到大量整数的二进制表示,...那么这个取反加一的方法是怎么得来的呢?我想不起来了。就自
  • 有符号整数 n位二进制的表示范围

    千次阅读 2012-03-18 23:05:00
    补码是模值减去该负数(原码)的绝对值也好,是原码取反加一也好, 最终的n位二进制表示的十进制范围就是-2(n-1)<=X<=2(n-1)-1 机器的减运算其实就是固定位数的两个二进制相加溢出的结果 转载于:...
  • js位运算-按位非

    2019-10-04 03:41:30
    正数 取得二进制表示 取反(发现符号位是1,表示负数) 符号位不变,其余位取反 ...取得负数的二进制表示(即绝对值的二进制反码加一取反即可 转载于:https://www.cnblogs.com/zt123123/p/11504052.html...
  • 计算机数据表示

    2017-09-25 20:58:00
    无符号数有符号数 最高位表示符号位 定点整数,最高位为符号位定点小数...整数的原码反码补码都相同 负数的反码为其绝对值取反,负数的补码位为其反码加一。在偏移2(n-1)次方时,移码为补码符号位取反。特例:0的原...
  • 计算机中的符号位 1.数据类型的最高位用于标识数据的符号 最高位为1,表明这个数为负数 ... 负数的补码为负数的绝对值各位取反加一 实例 :负数-8在计算机内部的表示(推演) 输出 : 推演 : 原数: -...
  • 有符号数和无符号数

    2018-04-16 19:41:51
    正数的补码为本身,负数的补码为负数的绝对值各位取反之后加一。一个字节是八位 十六进制0x01 二进制也就是0000 0001八位整数5的补码为 0000 0101八位整数-7的补码为1111 1001十六位整数20的补码为 0000 0000 0001 ...
  • 1、基础数据

    2018-08-06 17:11:29
    数据类型理解为固定内存大小的别名。 数据类型是创建变量的模子。...负数的补码为负数的绝对值各位取反加一。 在计算机内部用源码表示无符号数。无符号数默认为正数,无符号数没有符号位。 ...
  • 源码、反码、补码

    2019-12-20 15:20:37
    3) 取反加一(取补码的步骤是将其绝对值按位取反再加1即可) (2) 通用方法 变量A用N位来存储,当其为负数时计算其补码的方法是A=A+2^N; (3) 以下是原码和补码互换的(负数): 从数的右边往左开始数,遇到“0”...
  • 初识编程

    2018-08-10 17:30:30
    1 . C语言中的常见的数据类型有:char (1个字节,8位 ) short(2个字节,16位) int (2/4个字节,16 字节/32个字节) long int (4个字节,...负数的补码:取绝对值取反加一。 3.有符号类整型最高符号位即表...
  • Java位操作

    2013-09-27 15:52:26
    2、小于0:符号位(最高位)为1,其他为绝对值的原码取反加一。 比如来看-1的补码怎么得到: 1、绝对值的原码为:0x00000001 2、最高位设置1,得到:0x80000001 3、其他位取反得到:0xfffffffe 4、加一得到:0...
  • Java中byte转int

    2017-05-03 23:07:23
    计算机中数值以补码的形式表示和存储,正数的原码、反码、补码相同,负数的补码为其原码的绝对值所有位取反加一。  一个字节为8位,在计算机中补码01111111转换为原码十进制为127,补码10000000转换为原码十进制...
  • 负数转二进制的步骤是:取绝对值、换算成16进制、按位取反加一 负数转十进制的步骤是:减一、按位取反、换算成十进制、加负号 但是matlab里按位取反很麻烦,所以直接计算, (65535-(bitshift(data_h8,8)+data_...
  • 关于负数的补码

    千次阅读 2015-11-25 08:45:51
    源码--》补码:对应正数二进制表示的所有位取反,然后加一。 补码--》源码:对应正数二进制表示的所有位取反,然后加一。 补码的绝对值:(因为整数的补码就是源码,所以这里的补码指的就是负数的补码) 若要得到...
  • 看文章之前,两点提示:第一,不要管反码,以及反码和补码的关系 第二,忘掉符号位,没有符号位这个东西。...具体为该数的绝对值的按位取反然后加一 比如-7 第一步,把上面那个二进制数按位取反 11

空空如也

空空如也

1 2 3 4
收藏数 66
精华内容 26
关键字:

绝对值取反加一