精华内容
下载资源
问答
  • java二进制正数和负数取反

    千次阅读 2017-08-05 19:50:03
    要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。 另外正数和负数的补码不一样,正数的补码、反码都是其本身,负数的反码是符号位不变
    “反码”,“取反”,“按位取反(~)”,这3个概念是不一样的。
    取反:0变1,1变0
    反码:正数的反码是其本身,对于负数其符号位不变其它各位取反(0变1,1变0)
    按位取反(~): 这将是下面要讨论的。
    要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。
    另外正数和负数的补码不一样,正数的补码、反码都是其本身,负数的反码是符号位不变,其余位取反,补码是反码加1,即:
    正数11:
    原码:00001011
    补码:00001011
    反码:00001011
    负数-12
    原码:11111100
    反码:11110011
    补码:11110100
    对正数11按位取反
    原码: 00001011
    补码: 00001011
    反码: 00001011
    对补码取反: 11110100
    减1得反码: 11110011
    反码取反:     11111100

    对负数-12按位取反
    原码: 11111100
    反码: 11110011
    补码: 11110100
    对补码取反: 00001011


    对正数取反的口诀:补码取反减1取反
    对负数取反的口诀:原码取反加1取反
         规律:正数的取反等于正数加1取负        例如11的取反等于-12
            负数的取反等于负数加1取正      例如-12的取反等于11
    展开全文
  • 2、则9的二进制数为 0000 1001。 二、十进制负数二进制转换 1、先将9利用“除2取余法,余数逆序排列”,得到原码。 2、将上一步骤得到的原码取反(1取0,0取1,个数字除外,一直1),得到反码。对应反码...

    一、十进制正数的二进制转换

    1、9利用“除2取余法,余数逆序排列”,得到原码。
    在这里插入图片描述

    2、则9的二进制数为 0000 1001

    二、十进制负数的二进制转换

    1、先将9利用“除2取余法,余数逆序排列”,得到原码。
    在这里插入图片描述
    2、将上一步骤得到的原码取反(1取0,0取1,数个数字除外,一直为1),得到反码。对应反码为:11110110。
    3、在反码的基础上,加1得到补码。
    对应的补码为:11110111。
    在这里插入图片描述
    4、十进制负数转二进制方法总结如下:

    1. 除2取余,逆序排列 。
    2. 01互换,原码取反码 。
    3. 反码+1,得补码。

    三、逆向操作将二进制的负数转为十进制。

    1、将二进制数减1,得到:11101100。
    2、将减1后的代码取反操作,得到:00010011。
    3、将取反后的代码换算成十进制,得到19。‘
    4、在计算结果19的基础上要加上-号,结果为-19.
    在这里插入图片描述
    总结:
    1、二进制转十进制跟十进制转二进制互为逆操作;
    2、二进制由于只有0和1,没有符号,其实首位即代表其符号;

    展开全文
  • 浅谈二进制中的负数

    千次阅读 2019-02-10 14:15:28
    相信不少同学知道,如果要将一个数字转换它的相反,除了在它前面加个-号之外,还可以对该数字进行取反,之后再加 1。前者(本质是 0 减去对应的数字)可以得到相反,完全符合我们的直觉,但为何取反加一也可以...

    Hello!亲爱的看官老爷们,新年好~

    相信不少同学知道,如果要将一个数字转换为它的相反数,除了在它前面加个-号之外,还可以对该数字进行取反,之后再加 1。前者(本质是 0 减去对应的数字)可以得到相反数,完全符合我们的直觉,但为何取反加一也可以,这看起来不太科学,本文将带你一探究竟~

     

    首先要明白几个概念

    原码:比如12的原码(在八位机中)是,0000 1100,(-8)的原码是,1000 1000,其中首位是符号位,0代表正数,首位1代表的是负数。

    反码:正数的反码是其本身;负数的反码是保留符号位不变,其他位取反。(-8)的反码是1111 0111。

    补码:正数的补码是其本身;负数的补码是在反码的基础上加1。(-8)的补码是 1111 1000.

    整数在计算机中,是以 补码 形式存储的。
    --------------------- 
    作者:shnsxz 
    来源:CSDN 
    原文:https://blog.csdn.net/shnsxz/article/details/81978114 
    版权声明:本文为博主原创文章,转载请附上博文链接!

     

    从减法开始

    估计各位童鞋肯定听过以下这条法则:

    减去一个数,等于加上这个数的相反数。

    同时也应该了解,为了区分正负数,二进制中的最高位是符号位,其中正数的符号位是 0,而负数的符号位为 1。以 Java 的 byte 类型(8位,范围是 -128 ~ 127,即 00000000 至 11111111)为例,如果按照直觉,既然最高位为符号位,那么 -1 应该表示为 10000001。想法很美好,现实却很骨感。

    思考以下问题,尽管负数不确定,但我们肯定正数 1 表示为 00000001,如果需要得到算式 1-1的结果 ,按照上面的法则,可以将算式转化为 1+(-1) 进行运算,但是 10000001 + 00000001,无论怎么进行运算,似乎都很难得到 00000000 这个值吧?由此可见,计算机中储存负数的值,并不是那么简单的~

    拨动时钟

    负数的探索似乎陷入了死胡同,那让我们先把目光转移一下,从屏幕转到墙上的时钟之上~假设这个钟时针和分针可以分别进行调整,互不影响,且现在时钟显示的时间是 10:40,但对比北京时间,快了 10 分钟,那么我们改如何调整时钟呢?简单地做个算式:

        45
    -   10
    ----------
        35
    复制代码

    得出的答案是 35,那么将分针调整到 35 的位置即可,也不需要调整时针。很简单对吧?那如果现在时间也是 10:40,但时间快了 15 分钟,那该如何调整?你心中估计会想,那还不简单,算式一样能算出来~但这里加一个需求,不希望算式中出现借位(也就是 运算 40-15 时,由于被减数个位不如减数个位大,需要被减数从十位中借 1 到个位之上),那该如何实现呢?

    emmmmmmmm,似乎比较麻烦~借位是由于被减数的某一位不够减数大而导致的,那如果被减数足够大,似乎就能解决这问题。原式是 40-15,可以等价改写为 40+(59-15)-59,答案是完全一致的。但这里还是有问题,运算两次之后,剩下的算式为 84-59,仍然要借位不是吗?那我们再改写一下:40+(59-15)+1-60。这样的算式运算下来,不再需要借位了。换成时钟操作,就是直接将分针调整到 25 即可。

    看到这里,估计你心中会多了一点明悟,但似乎其中还有一些说不过去的地方对吧?比如这个例子:现在的时间是 10:15,现在的时间比北京时间快了 40 分钟,那该如何进行运算呢?按照上面的例子,可以依样写下这条算式 15+(59-40)+1-60,但问题来了,算到最后,是 35-60,还是要借位不是吗?

    是,但可以不是。-60 在时钟上的本质是,将时针回拨一下。那么 35-60,其实可以分解为两个操作,时针拨动到 35 的位置,时针回拨到 9 的位置,现在的时间为 09:35,难道不是正确的答案吗?

    不那么一样的数轴

    在恍然大悟前先停一下,还有一点点东西需要了解。相信数轴的概念铭刻在各位心中,它是完全符合直觉的,且数轴是无穷的,相信大家也都知道,一般印象中的数轴如下:

    -60, -59, -58, -57···, -2, -1, 0, 1, 2···57, 58, 59

    但如果数轴是有范围的话,假设总共只有 120 个整数在数轴上,如果我们想消除负号,那么用正数表示负数,也未尝不可,比如以 59 为分界,大于 59 的数均为负数。即 -1 表示为 119,-40 表示为 80,-25 表示为 95 等:

    60, 61, 62, 63···118, 119, 0, 1, 2···57, 58, 59

    那么之前时钟的例子,是以 59 作为避免借位的被减数,但这是为了方便时钟拨动,这里我们再往前跨一步,刚才时钟的运算:15-40 可以表示为 15+80,运算结果是 95,对表查询可得,95 的值代表的是 -25,运算正确!

    你可能会吐槽减法是借位了,但主要是为了方便映照时钟的例子,换成 999 作为避免借位的被减数,就是标准对 9 的补数。不妨在纸上画一下,此时 -1 表示为 999,-40 表示为 959,-25 表示为 974,15-40 即 015+959,运算结果是 974,也是完全对应上的。

    重回二进制

    有了上面的铺垫,二进制的负数已经呼之欲出啦~符号位天然可以作为正负数的分割点。还是以 Java 的 byte 类型为例,8 位一共可以表示 256 个数字,由于 0 表示为 00000000,首位符号位也是 0,因而正数少一位,按照上一节的例子,推出当前序列为:

    10000001, 10000002···11111101, 11111110, 11111111, 00000000, 00000001···01111101, 01111110, 01111111

    二进制数 十进制数
    10000000 -128
    10000001 -127
    10000002 -126
    ··· ···
    11011000 -40
    ··· ···
    11100111 -25
    ··· ···
    00001111 15
    ··· ···
    01111111 127

    那么还是这条算式:15-40,二进制中即为 00001111+11011000,稍微数一下手指,得出答案是 11100111,对应的值为 -25!

    然而,这个表背起来是没意义的,那该如何运算呢?思考一下,之前运算 15-40 时,我们转换为 15+(59-40)+1-60,59 为足够大的被减数,在 byte 类型中,最大的数不会超过 11111111(即 255),因而可以转换为:

        11111111(255)
    -   00101000(40)
    +   00000001(1)
    +   00001111(15)
    -  100000000(256)
    复制代码

    二进制其实十分有趣,先观察首先需要运算的 11111111-00101000,结果是 11010111,也就是各位取反,下一步是加一,得到结果是 11011000,不就是表中 -40 对应的值了么?所以该表的推导是有严格的数学意义的,并不是随便编造一个表,到这里,应该明白为何在计算机中,取某个数的相反数是取反再加一了吧~

    算式最后一步是减去 256,计算机中这步都可以省下了,因为 256 已经超过 byte 的范围,直接忽略。同理,如果计算如 -1+1 之类的算式时,会得到答案是 256 (即 100000000),但由于超过范围,首位 1 直接被忽略不计,因而得出的答案是 0 。以上运算,符号位均参与运算,并不需要区别对待,这对计算机而言是非常友好的。

    小结

    为严谨起见,补充两个条件:

    1. 运算数均为整数。
    2. 计算结果均不溢出。

    以上就是全文的内容啦,二进制相关的知识,其实是相当有意思的,也许了解它们并不会使我们的代码能力突飞猛进,但保持好奇心,不断探索未知的领域,一定是一个良好的习惯~

     

     

    本文选自掘金博客 https://juejin.im/post/5c530559f265da2d9617e1af

    展开全文
  • 计算一个数二进制中一的个数,并把这个对应的二进制序列输出。

    计算一个数二进制中一的个数,并把这个数对应的二进制序列输出。

    下面是程序:

    #define _CRT_SECURE_NO_DEPRECATE 1
    #include <stdio.h>    
    #include <stdlib.h>   
    int check_one(int input)
    {
    	int count=0;
    	int a;
    	int i=0;
    	for(i=0;i<32;i++)
    	{
    	   a=(input>>i)&1;         //取出input中的第i位然后和1与再赋給a,这样就拿到了第i位
    	   if(a=1)
    	    {
    	     count++;
    	    }
    	}
    	return count;
    }
    void output_in_bin(int input)
    {
    	int j=31;
    	int b;
    	printf("input对应的二进制数是:");
    	for(j=31; j>=0; j--)
    	{
    	  b=(input>>j)&1;
    	  printf("%d",b);
    	}
    }
    int main()
    {
    	int input = 0;
    	int ret = 0;
    	scanf("%d",&input);
        ret=check_one(input);
    	printf("input对应的二进制中1的个数是:%d \n",ret);
    	output_in_bin(input);
    	system("pause");
    	return 0;
    
    }
    

    当然了 你可以把计算1的个数和输出二进制序列放下一起实现,不过一个子函数最好专门实现一个功能。

    运行结果:

    
    
    展开全文
  • //将一个int型整数转换为二进制数 string itob(int number) { string binNum; while (number) { binNum += '0' + number%2; number /= 2; } reverse(binNum.begin(), binNum.end()); return binNum; } ...
  • * 判断二进制数中有多少个1 * @author 17976 * */ public class Test { public static void main(String[] args) { int number = 9; System.out.println(count1(number)); } /* *右...
  • 例如数学上,1+(-1)=0,而在二进制中00000001+ 10000001=10000010,换算成十进制-10,错误。 但是采用他们的补码:00000001+11111111=00000000. 则可以进行正常的直接加减运算。 所以:对于求补码问题。 正数
  • 比如:十进制转二进制 二:【小数】十进制转任意进制:辗转相乘取余,取出整数部分,直到小数的十分位0为止,倒叙输出整数部分 比如:十进制转二进制0.36 三:【整数】任意进制转十进制:从最后一位倒叙开始,...
  • 进制负数转换成二进制数的方法

    千次阅读 2017-07-24 16:35:44
    负数转换为二进制,就是将其相反(正数)的补码的每一位变反(1变0,0变1)最后将变完了的数值加1,就完成了负数的补码运算。这样就变成了二进制。 举个例子: 将-1变成二进制。 ①首先确定二进制的位数,...
  • 二进制数与十进制的转换 聊二进制数的运算前,我们先看看二进制数的值与十进制的值是如何相互转换的, 十进制转换成二进制 将十进制除以2,得到的商再除以2,依次类推直到商为1时为止,然后在旁边标出各步的...
  • #include #include int p[1200]; int main() {   int i,t=0,n,kkk=0;//kkk=0表示正数,kkk=1表示负数   while(scanf("%d",&n)!=EOF)   {     memset(p,0,sizeof(p));    t=kkk=0;    if(n    {  
  • 二进制数中的1的个数的奇偶性: 如果一个二进制数中的1的个数奇数,那么返回1;如果偶数,那么返回0。 给定二进制数01,它只有两位,那么它的奇偶性可以通过0^1 = 1获得,这里返回1,与它是奇数相符合。 给定...
  • 负数转化为二进制数

    千次阅读 2013-09-20 15:29:55
    可以这样理解,用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存的绝对值的话,能表示27个的绝对值,再考虑正负两种情况,27*2还是256个。首先定义0在计算机中储存00000000,对于...
  • 小古银的官方网站(完整教程):http://www.xiaoguyin.com/ ... 目录 目录 ...正负数转换 ...前面已经讲过二进制和整数的关系,现在再补充一下。我们知道数据都是使用二进制保存和处理的,而二进制没有...
  • 文章目录1 十进制转为二进制1.1 正数的二进制1.2 负数二进制2 正负数与原码、反码、补码2.1 原码2.2 反码2.3 补码2.4 总结3 转换代码3.1 五种位操作简介3.2 十进制转二进制代码 1 十进制转为二进制 先放出结论...
  • 二进制负数转换成十进制

    千次阅读 2017-12-15 10:17:15
    例:(-10)11110110转化成十进制(前提是二进制负数)1.(二进制)11110110逐位取反:00001001; 2.二进制+1得:00001010,加上负号; 3.结果-10;例:(-5)11111011转化成二进制1.(二进制)11111011...
  • 进制负数转化成二进制

    万次阅读 2017-12-15 09:12:14
    3.对取反后的二进制数加1,结果就是十进制负数转化成的二进制数。 例:-32转化成二进制数 1.(十进制)32=(二进制)00100000 2.(二进制)00100000逐位取反:11011111 3.二进制数+1得:11100000 例:-5...
  • 1.十进制转化为二进制数 十进制15 上图中箭头的方向即为二进制数中从低位到高位(从右往左)的顺序, 二进制数为:0000 0000 0000 0000 0000 0000 0000 1111 2.十进制转化八进制 十进制:15 与...
  • 使用递归函数实现将一个十进制转化为二进制数

    千次阅读 多人点赞 2019-10-21 13:05:46
    使用递归函数实现将一个十进制转化为二进制数 思路简析: 因为递归函数有一个调用本身的过程,所以会先打印出最后调用的。儿我们在使用短除法的时候也是将余数进行倒序输出。所以,采用递归函数进行二进制转化更...
  • 在十进制中表示正负数会有专门的符号来区分,而在二进制中,...我们都知道十进制 1, 用二进制表示是:0000 0001,那么,-1用二进制怎么表示呢? 可能有人会说,把0000 0001的符号位变成1不就完了吗? 也就是表...
  • 符号位1的二进制转十进制负数

    千次阅读 2016-05-03 13:23:32
    2、符号位1的二进制转十进制负数  相信大家已经知道如何个转法了,不过在此还是说明一下。  ①除去符号位减1;  ②除去符号位,按位取反;结果就是负数的源码;  ③源码转成相应的十进制。  ...
  • 将十进制转换为二进制数

    千次阅读 2015-08-12 16:14:53
    尾声前言题目:如何将一个十进制的转换为二进制数?补充说明,这是我在做一个项目时发现的问题,因此顺手把这个问题给解决了一下。代码#include using namespace std;//函数binary说明:整个函数递归实现,其中...
  • 源码 原码就是符号位加上真值的绝对值, 即用第一位表示... 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111] 即 [-127 , 127] 反码 正数的反码是其本身 负数的反码
  • 二进制中正负数表示和判断

    千次阅读 2017-03-07 22:32:50
    1代表负我知道,但是给你一个二进制比如101 那么转化成十进制应该是多少? 5? 但不是说首位1应该是负的吗???  谁能给我讲讲这个首位什么时候作为符号,什么时候作为数字去计算?什么时候可以直接计算...
  • // 0x80000000 是一个首位1,其余位数0的整数 int t = (number & 0x80000000 >>> i) >>> (31 - i); sb.append(t); } } return sb.toString(); } public static void main(String[] args) ...
  • 使用二进制补码表示二进制负数方法合理性的证明 目录 使用二进制补码表示二进制负数方法合理性的证明 二进制补码的定义 补码与反码的关系 定理 1 计算机中二进制负数 定理2 注释 二进制补码的定义...
  • 首先,我们来看看原码,反码,补码的关系: 以8位二进制为例,正数的原码、反码、补码相同, 负数的反码:除符号位外,原码各位取反,反码加1,得负数的反码. 下面就对于原码,反码,补码详细分析一下: 原码:将一个...
  • 以十进制整数6例 ...6的二进制数为110 -6:就是6的二进制数取反+1。(取反:将二进制数的1变成0,0变成1) 在内存中(32位)其实6的变现形式: 取反后: 加1: 负数的二进的最高位是1。
  • 负数转换为二进制,就是将其相反(正数)的补码的每一位变反(1变0,0变1)最后将变完了的数值加1,就完成了负数的补码运算。这样就变成了二进制。 举个例子: 将-1变成二进制。 ①首先确定二进制的位数,假定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,477
精华内容 47,390
关键字:

如何判断二进制数为负数