正负整数和小数转二进制

  1. 转成二进制主要有以下几种:正整数转二进制,负整数转二进制,小数转二进制;

    1、  正整数转成二进制。要点一定一定要记住哈:除二取余,然后倒序排列,高位补零。

    也就是说,将正的十进制数除以二,得到的商再除以二,依次类推知道商为零或一时为止,然后在旁边标出各步的余数,最后倒着写出来,高位补零就OK咧。哎呀,还是举例说明吧,比如42转换为二进制,如图1所示操作。

  2.  

    42除以2得到的余数分别为010101,然后咱们倒着排一下,42所对应二进制就是101010.如图2所示更直观的表达。

  3.  

    计算机内部表示数的字节单位是定长的,如8位,16位,或32位。所以,位数不够时,高位补零,所说,如图3所示,42转换成二进制以后就是。00101010,也即规范的写法为(42)10=(00101010)2.赶紧记住吧。

  4.  

    2、  负整数转换成二进制

    方法:先是将对应的正整数转换成二进制后,对二进制取反,然后对结果再加一。还以42为例,负整数就是-42,如图4所示为方法解释。最后即为:(-42)10=(11010110)2.

  5.  

    3、  小数转换为二进制的方法:对小数点以后的数乘以2,有一个结果吧,取结果的整数部分(不是1就是0喽),然后再用小数部分再乘以2,再取结果的整数部分……以此类推,直到小数部分为0或者位数已经够了就OK了。然后把取的整数部分按先后次序排列就OK了,就构成了二进制小数部分的序列,举个例子吧,比如0.125,如图5所示。

  6.  

    如果小数的整数部分有大于0的整数时该如何转换呢?如以上整数转换成二进制,小数转换成二进制,然后加在一起就OK了,如图6所示。

  7.  

    4、  整数二进制转换为十进制:首先将二进制数补齐位数,首位如果是0就代表是正整数,如果首位是1则代表是负整数。

    先看首位是0的正整数,补齐位数以后,将二进制中的位数分别将下边对应的值相乘,然后相加得到的就为十进制,比如1010转换为十进制,方法如图7所示。

  8.  

    5、若二进制补足位数后首位为1时,就需要先取反再换算:例如,11101011,首位为1,那么就先取反吧:-00010100,然后算一下10100对应的十进制为20,所以对应的十进制为-20,方法如图8所示。

  9.  

    6、将有小数的二进制转换为十进制时:例如0.1101转换为十进制的方法:将二进制中的四位数分别于下边(如图9所示)对应的值相乘后相加得到的值即为换算后的十进制。

    END

为什么要用反码和补码?

先看正码表示,设N=4, -1 = 1001; -2 = 1010, -1 > -2, 但是 1001 < 1010,两种映射的编码的序性不一致

反码呢,-1=1110, -2 = 1101,  Ok,序性正确了,

然而,这里有一个问题,就是正数与负数之间,有一个1的缝隙。-1=1110, 1=0001,从循环编码的角度,这两个编码相差3:1110->1111->0000->0001。

因为正零和负零是两个数,导致两个数系的断裂。怎么办?让负数整体往正数靠拢,迈进一步(+1),负1没有了。

这就是求补的过程了。反码再加1。

我想,当初写出计算机的编码设计论文的大牛(好像是图灵还是什么的),当然有更深的考虑。但从序性和数系联系的角度,补码的发明是相当合理的。而这种合理性,我个人认为,正是其优点。

从机器实现的角度,并不算复杂,但相对反码的机器实现,还是多了+1的进位延时。

时间: 2024-11-07 01:12:59

正负整数和小数转二进制的相关文章

10--输入一个十进制的整数,转化为二进制,输出有多少个1

/* 问题描述: 输入一个十进制的整数,转化为二进制,输出有多少个1. 解题思路: (1):位操作,然后移动光标.不是移动输入数字,而是移动flag. 因为负数第一个为1,向右移动为了保证负数,所以填充为1, 出现无限循环的可能. (2):第二种效率更高,二进制出现多少个1,就循环多少次. while (n) { number++; n = (n - 1) & n; } 相关问题: (1) 一条语句判断是不是2的整数次方. 那就是判断是否只有一个1! if (n != 0 && (

整数,小数及常用的正则表达式

匹配中文字符的正则表达式: [/u4e00-/u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^/x00-/xff]评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:/n/s*/r评注:可以用来删除空白行 匹配HTML标记的正则表达式:<(/S*?)[^>]*>.*?<//1>|<.*? />评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套

验证整数、小数、实数、有效位小数最简单JavaScript正则表达式

输入完按回车后即可验证!(自认为最简单!) 正整数: 负整数: 整 数: 正小数: 负小数: 小 数: 实 数: 保留1位小数: 保留2位小数: 保留3位小数: 说明:IE6.0.IE7.0.IE8.0.Firefox/3.0.11下测试通过 作者原创!转载请说明出处:http://blog.csdn.net/xxd851116 [测试源码]: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

SQL判断一个数是整数还是小数

DECLARE @number1 AS numeric(10,2),@number2 AS numeric(10,2) SELECT @number1=10.00,@number2=10.2 SELECT CASE WHEN CAST(@number1 AS INT)[email protected] THEN '整数' ELSE '小数' END, CASE WHEN CAST(@number2 AS INT)[email protected] THEN '整数' ELSE '小数' END 

计算机内部整数的表示(二进制存储)

10.在16位机器上跑下列foo函数的结果是(B)(阿里2014笔试题)   void foo()   {       int i = 65536;       cout << i<<”,”;       i = 65535;       cout << i;   }   A.-1,65535   B.0,-1     C.-1,-1    D.0,65535 解析:16位机器的int型变量为16位 16位int的表示范围:-32768到32767 65535(十进制)

PHP 验证整数或小数二位的正则

// $accountPrice = $_GET['num']; // $accountPrice = 111; // $accountPrice = 1112.; // $accountPrice = 2324.1; // $accountPrice = 2324.15; // $accountPrice = 2324.157;//wrong // $accountPrice = 0.57; if (preg_match('/^[0-9]+(.[0-9]{1,2})?$/', $account

easy-ui表单字段(单字段---》验证---》整数、小数 、%(同时需要))

// 单字段--->验证--->整数.小数  .%(同时需要) <script> //保底值 $.extend($.fn.validatebox.defaults.rules, {     //此句为自定义重写校验 bottom_value: { validator: function (value) { return /^\d+(\.\d+)?$/i.test(value); }, message: '请输入(整数,小数,百分率),并确保格式正确' }, }); </scr

input 输入大于1的数(可以是整数或小数)oninput 和正则

<input type="number" oninput="this.value=this.value.replace(/[^1-9\.]/g,'');" //用的oninput方法和正则表达式,如果是只能输入大于0的整数或小数则改为(/[^0-9\.]/g,'') id="raisingAmount" step="1" min="0"> 原文地址:https://www.cnblogs.com

给整数和小数设置不同的样式

分别给整数和小数设置各自的元素标签. 困难之处就在于如何将整数和小数分开.(分开后写入不同的标签内,分别设置样式即可) 将整数和小数分开的方法:(我自己想的,虽然笨拙,但管用,欢迎大家补充新的方法) 假如这个数是num; 整数部分a:num..split(".")[0]; 小数部分b:num..split(".")[1]; 再分别将a,b写入不同的标签内,JQ的text()或者原生的innerText()都可以哦. 就是这么简单!!! 原文地址:https://ww