补码

C语言程序设计100例之(26):二进制数中1的个数

有些话、适合烂在心里 提交于 2020-02-13 10:34:53
例26 二进制数中1的个数 问题描述 如果一个正整数m表示成二进制,它的位数为n(不包含前导0),称它为一个n位二进制数。所有的n位二进制数中,1的总个数是多少呢? 例如,3位二进制数总共有4个,分别是4(100)、5(101)、6(110)、7(111),它们中1的个数一共是1+2+2+3=8,所以所有3位二进制数中,1的总个数为8。 输入格式 一个整数T,表示输入数据的组数,接下来有T行,每行包含一个正整数 n(1<=n<=20)。 输出格式 对于每个n ,在一行内输出n位二进制数中1的总个数。 输入样例 3 1 2 3 输出样例 1 3 8 (1)编程思路1。 对于输入的n,n位二进制数m是位数为n并且首位为1的二进制数,且满足:     2 n-1 ≤ n位二进制数m < 2 n   因为首位为1,n位二进制数的个数就是n-1位的0和1的组合数,即2 n-1 个。   第1位必须为1,所以第1位的1的个数为2 n-1 个。   其他n-1位,总位数为(n-1)* 2 n-1 。其中0和1的个数是一半对一半,所以1的个数为(n-1)* 2 n-1 /2。   合计1的位数为:2 n-1 +(n-1)* 2 n-1 /2。 因此,n位二进制数中1的个数直接用上式计算出来。计算时,用移位运算来计算2的n次方是一种快速的计算方法。 即n位二进制数中1的个数为 :1<<(n-1)+

原码 & 反码 & 补码 & 详解

徘徊边缘 提交于 2020-02-13 09:43:08
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因 为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数,

原码, 反码, 补码 详解

落爺英雄遲暮 提交于 2020-02-13 09:42:46
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因 为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1] 原 = 0000 0001 [

原码, 反码, 补码 详解

倾然丶 夕夏残阳落幕 提交于 2020-02-13 09:42:31
转自 原码, 反码, 补码 详解 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]

【Java基础】15、负数的二进制表示方法

风格不统一 提交于 2020-02-13 09:42:00
在计算机中,负数以其正值的补码形式表达 。 什么叫补码呢?这得从原码,反码说起。   原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。 比如 00000000 00000000 00000000 00000101 是 5的 原码。   反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。 取反操作指:原为1,得0;原为0,得1。(1变0; 0变1) 比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。 称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。 反码是相互的,所以也可称: 11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。   补码:反码加1称为补码。 也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。 比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。 那么,补码为: 11111111

负数的二进制表示方法(正数:原码、负数:补码)

筅森魡賤 提交于 2020-02-13 09:41:39
原文连接:http://blog.csdn.net/diandianxiyu_geek/article/details/44098121 一:表示法: 1、正数5的表示法 假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为: 00000000 00000000 00000000 00000101 5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。 2、负数-5的表示法 现在想知道,-5在计算机中如何表示?在计算机中,负数以原码的补码形式表达。 二、概念: 1、原码: 一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。 比如 00000000 00000000 00000000 00000101 是 5的 原码。 10000000 00000000 00000000 00000101 是 -5的 原码。 备注: 比如byte类型,用2^8来表示无符号整数的话,是0 - 255了;如果有符号, 最高位表示符号,0为正,1为负,那么,正常的理解就是 -127 至 +127 了.这就是原码了,值得一提的是,原码的弱点,有2个0,即+0和-0(10000000和00000000);还有就是,进行异号相加或同号相减时,比较笨蛋,先要判断2个数的绝对值大小,然后进行加减操作

负数在计算机中的表示方法

ぃ、小莉子 提交于 2020-02-13 09:41:24
转载于: http://www.cnblogs.com/junsky/archive/2009/08/06/1540727.html 对负数的二进制表示有些遗忘,在网上找了一下资料,贴出来已备再次遗忘: 假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为: 00000000 00000000 00000000 00000101 5转换成二制是101,不过int类型的数占用4字节( 32位 ),所以前面 填了一堆0 。 现在想知道,-5在计算机中如何表示?   在计算机中,负数以其绝对值的补码形式表达 。 什么叫补码呢?这得从原码,反码说起。   原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。 比如 00000000 00000000 00000000 00000101 是 5的 原码。   反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。 取反操作指:原为1,得0;原为0,得1。(1变0; 0变1) 比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。 称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。 反码是相互的

负数的二进制表示方式

坚强是说给别人听的谎言 提交于 2020-02-13 09:40:57
我们已经知道计算机中,所有数据最终都是使用二进制数表达。 我们也已经学会如何将一个10进制数如何转换为二进制数以及如何将如何将一个16进制数如何转换为二进制数,详见下图。 不过,我们仍然没有学习一个负数如何用二进制表达。 比如,假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为: 00000000 00000000 00000000 00000101 5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。 现在想知道,-5在计算机中如何表示? 在计算机中,负数以其正值的补码形式表达 。 什么叫补码呢?这得从原码,反码说起。 原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。 比如 00000000 00000000 00000000 00000101 是 5的 原码。 反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。 取反操作指:原为1,得0;原为0,得1。(1变0; 0变1) 比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。 称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。 反码是相互的

原码,补码,反码

淺唱寂寞╮ 提交于 2020-02-13 09:40:39
计算机中所有的数据运算和数据存储都是补码的形式。 正数的原码,反码,补码都相同 负数的原码符号位为1(标识为负数),反码是对其原码逐位取反(符号位除外) 负数的补码通过在其反码的末尾加1得到 为甚采用补码计算呢? 由于计算机计算是在cpu中进行的,cpu中只有加法器,没有减法器,没法直接做减法运算, 我们知道,负数的表示符号位是1,(而补码的设计就是为了让符号位也参与运算)符号位同样参与运算 例如:9 - 2 = 9 + (-2) 原码:9 0000 1001    -2 1000 0010 + 1000 1011 (-1) 反码: 9 0000 1001    -2 1111 1101 +(1)0000 0110 (6) 补码:9 0000 1001 -2 1111 1110 +(1)0000 0111 (7) 可以看到,通过补码运算得到了想要的结果。 为什么要这要设计补码呢?(或者说补码设计的原理什么呢?) 9 - 2 = 9 + (-2) 例如字长为8,8个二进制位共可以表示2^8(256)个数字,包括符号位 表示范围0-->127(0111 1111)-->-128(1000 0000)-->-1(1111 1111)-->0(补码表示) -128(1000 0000),符号位为1,转换成原码(减1取反)(0111 1111)-->(1000 000) (1000 0000

原码,反码与补码理解

故事扮演 提交于 2020-02-13 09:40:21
原码,反码与补码理解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象。同时希望可以帮到正在学习这方面知识的同学,可以相互学习。新手上路请多关照,如果问题还请不吝赐教。 2. 前置知识 字节 → 位 → 二进制数 计算机存储数据使用字节进行存储,机器有32位,64位为一个最小存储单元,1个字节为8位,那么32位机器一个存储单元存储4个字节,64位机器一个存储单元为8个字节。计算机使用二进制来表示数据,1位代表一个二进制数,要么是1,要么是0。 3. 引出原码 既然是数据,那么就有大小,就需要对数值进行运算。我们用真值来表示数据的大小,正负。 十进制:+8 = 二进制:+1000 十进制:-6 = 二进制:-0110 +1000,-0110既是真值,但是计算机在存储数据时没有单独存储数值的正负,而是同样用1,0来存储负,正,那么这就是原码表示。 十进制:+8 = 二进制:01000 十进制:-6 = 二进制:10110 表示是没有问题?但是问题又出现了,那就是如果是同符号运算,我们很好算,如果符号不相同的两个数相加,我们首先要判断哪个数更大,然后相减得到结果,再用大数的符号标注,这样每次算更加麻烦。而且计算机没有设计减法运算,只有加法运算,因为加法运算更加快速。我们如何来实现2个数的减法。下面就是加法转减法的思路: 4. 同余模数 以表盘为例:表盘有12个刻度