二进制数与位运算符

更新日期: 2020-10-10阅读: 2.7k标签: 进制

位运算符是基于二级制数进行操作的,即表示数字的 32 个数位,它由0和1组成…


二进制数表示整数18

ECMAScript整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)。在ECMAScript中,所有整数字面量默认都是有符号整数。

有符号整数使用31位(第0到第30位)表示整数的数值,用第32位(第31位)表示整数的符号,0表示正数,1表示负数。数值范围从-2147483648到2147483647。

前31位中的每一位都表示2的幂,从第1 位(位 0)开始,表示20,第2位(位1)表示21。没用到的位用0填充,即忽略不计。例如,下图展示的是数18的表示法。

18的二进制版本只用了前5位,它们是这个数字的有效位。把数字转换成二进制字符串,就能看到有效位:

var Num = 18;
alert(Num.toString(2));	//输出 "10010"

这段代码只输出”10010”,而不是18的32位表示。其他的数位并不重要,因为仅使用前5位即可确定这个十进制数值。如下图所示:

二级制数表示负数-18

负数也存储为二进制代码,不过采用的形式是二进制补码。计算数字二进制补码的步骤有三步:

1.确定该数字的非负版本的二进制表示(例如,要计算-18的二进制补码,首先要确定18的二进制表示) 2.求得二进制反码,即要把0替换为1,把1替换为0 3.在二进制反码上加1

按照如上步骤计算:

1)获取18的二级制表示

0000 0000 0000 0000 0000 0000 0001 0010

2)求得二进制反码

1111 1111 1111 1111 1111 1111 1110 1101

3)在二进制反码上加1

1111 1111 1111 1111 1111 1111 1110 1101
                                      1
---------------------------------------
1111 1111 1111 1111 1111 1111 1110 1110

因此,-18的二进制表示即1111 1111 1111 1111 1111 1111 1110 1110。记住,在处理有符号整数时,开发者不能访问31位。

特别需要注意的是,把负整数转换成二进制字符串后,ECMAScript并不以二进制补码的形式显示,而是用数字绝对值的标准二进制代码前面加负号的形式输出。例如:

var iNum = -18;
alert(iNum.toString(2));	//输出 "-10010"

这段代码输出的是”-10010”,而非二进制补码,这是为避免访问位31。所有整数字面量都默认存储为有符号整数。只有ECMAScript的位运算符才能创建无符号整数。


二级制数表示小数

现代计算机中,一般都以IEEE 754标准存储浮点数,这个标准的在内存中存储的形式实际上是一种科学计数法 ,用符号,指数和尾数来表示,底数为2,也就是把浮点数表示为尾数乘以2的指数次方再添加上符号的形式。

 符号位阶码尾数总长度
float182332
double1115264

浮点数在内存中的是使用科学计数法来表示的,我们先将浮点数用二进制的形式表示出来。

// 整数部分
// 例如12可以表示为
// 2³*1 + 2²*1 + 2¹*0 + 2º*0  = 12
// 8*1 + 4*1 + 2*0 + 1*0  = 12
// 二级制表示为1100

//小数部分
// 例如0.18的小数部分可以表示为
// ½*0 + ¼*0 +  ...  = 0.18
// 0.5*0 + 0.25*0 + 0.125*1 + 0.0625*0 + 0.03125*1 + ...  = 0.18
// 也就是说小数可以表示为2的附一、负二、负三次方...这样的数相加
// 二级制表示为0.001011100001010001111010111000010100011110101110000101

12.18表示为double

1)获取二进制表示

12.18使用二级制表示为1100.001011100001010001111010111000010100011110101110000101。

2)获取科学计数法的表示

double类型尾数为52位,使用科学计数法表示,不足52位补0,超出部分删除,最终结果为1.1000010111000010100011110101110000101000111101011100*2³。

3)计算阶码

double类型阶码共11位,可以表示-1024~1023,因为指数可以为负数,为了方便表示,先加上1023变为非负数,上面的3表示为3+1023=1026,二进制为10000000010。

4)最终结果

符号位,0为正,1为负。所以最终结果是

0 10000000010 1000010111000010100011110101110000101000111101011100

12.18表示为float

1)获取二进制表示

12.18使用二级制表示为1100.001011100001010001111010111000010100011110101110000101。

2)获取科学计数法的表示

float类型尾数为23位,使用科学计数法表示,不足52位补0,超出部分删除,最终结果为1.10000101110000101000111*2³。

3)计算阶码

float类型阶码共8位,表示的范围是-128~127,因为指数可以为负数,为了方便表示,先加上127变为非负数,上面的3表示为3+127=130,二进制为10000010。

4)最终结果

符号位,0为正,1为负。所以最终结果是

0 10000010 10000101110000101000111


二级制与8进制、16进制之间的转换

十进制数由0~9共10个数字字符组成,在十进制数的每一位上满十进一,在十进制每一位中表示最大数字为9.

二进制数由0和1两个数字字符组成,在二进制中“逢二进一”,在二进制每一位中表示最大数字为1.

八进制是由0~7共8个数字字符组成,在八进制中“逢八进一”,在八进制中每一位中表示最大数字为7.

十六进制是由0~9、A、B、C、D、E、F共16个字符组成,在十六进制中“逢十六进一”,在十六进制中最大的数是F。

// 如十进制的123使用二进制、八进制、十六进制表示
// 二进制
// 123 = 64*1 + 32*1 + 16*1 + 8*1 + 4*0 + 2*1 + 1*1
// 1111011
(123).toString(2)

// 八进制
// 123 = 8*8*1 + 8*7 + 1*3
// 173
(123).toString(8)

// 十六进制
// 123 = 16*7 + 1*11
// 7b
(123).toString(16)


位运算操作

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。

1、位运算 NOT(~)

位运算NOT由否定号(~)表示,位运算NOT是三步的处理过程:1)把运算数转换成32位数字2)把二进制数转换成它的二进制反码3)把二进制数转换成浮点数。它实质上是对数字求负,然后减1。

var iNum1 = 25;		//25 等于 00000000000000000000000000011001
var iNum2 = ~iNum1; //转换为 11111111111111111111111111100110
alert(iNum2);		//输出 "-26"

2、位运算 AND(&)

两个都为1才为1,否则为0。

第一个数字中的数位第二个数字中的数位结果
111
100
010
000
**3、位运算 OR()**

两个中有一个为1结果就为1,否则为0。

第一个数字中的数位第二个数字中的数位结果
111
101
011
000

4、位运算 XOR(^)

两个中有且仅有一个为1结果就为1,否则为0。

第一个数字中的数位第二个数字中的数位结果
110
101
011
000

位运算常见使用场景

1、判断一个数是奇数还是偶数

利用and运算 & 判断一个数是奇数还是偶数,这是因为二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。因此只需要把数和1进行and运算,根据结果就可以判断。

var val = 15;
if(val&1 === 0){
    console.log('值为偶数')
}
if(val&1 === 1){
    console.log('值为奇数')
}

来自:https://www.kelede.win/posts/二进制数与位运算符/


链接: https://fly63.com/article/detial/9840

二进制和十进制相互转换、位移运算

自己的解题思路是将十进制的数转为二进制(不足32位补0),然后依次取8位转化为十进制的数字,再用.连接即为IP。里面的几个点记录一下:十进制转换为二进制 numObj.toString([radix]) radix可以指定进制

Js进制转换

参数radix支持 [2, 36] 之间的整数。例如:参数值为2,则表示二进制;为8,则表示八进制;为16,则表示十六进制。如果省略参数radix,则默认为10(十进制)。

理解二进制操作

最近在用 shell 写一个小工具,里面要用到复杂的二进制操作,对 int 值进行位操作和与或非,而 shell 的语法里, & 是取布尔与, >> 是重定向,不支持二进制操作,为了写出只需要默认系统环境就可以运行的程序

js 进制转换/进制编码解码

js 进制转换支持 2-36 , 即 0-9a-z .可以用于混淆、数值缩短、特殊符号转换…字符串36进制编码解码;ip地址端口号36进制编码解码

Js将十进制转换为十六进制?

JavaScript中有很多内置函数可以帮我们进行数(进)制转换。那么给定一个十进制数字,如何将数字从十进制转换为十六进制?下面本篇文章就来给大家介绍一个使用JavaScript将十进制转换为十六进制的方法

JavaScript 进制转换&位运算

在一般的代码中很少会接触到进制和位运算,但这不代表我们可以不去学习它。作为一位编程人员,这些都是基础知识。如果你没有学过这方面的知识,也不要慌,接下来的知识并不会很难。本文你将会学习到:进制转换,按位操作符,Javascript进制转换

nodejs怎么存取2进制数据?

在客户端javascript脚本代码中,对于二进制数据并没有提供一个很好的支持。然后在nodejs中需要处理像TCP流或文件流时,必须要处理二进制数据。因此在node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区

十进制与十六进制之间的转换

将十进制数 x 除以 16, 即 x = q * 16 + r,取得余数 r 和 商 q,此时余数 r 就是 x 用十六进制表示时的最低位值; 之后商值 q 继续进行以上的除法操作, 获取每次的余数 r 作为 十六进制表示时的低位值, 直到 q 值小于 16 为值, 此时的

JavaScript中的多种进制与进制转换

JavaScript 中提供的进制表示方法有四种:十进制、二进制、十六进制、八进制。对于数值字面量,主要使用不同的前缀来区分:

Js二进制家族:文件base64、File、Blob、ArrayBuffer互转

JavaScript 提供了一些 API 来处理文件或原始文件数据,例如:File、Blob、FileReader、ArrayBuffer、base64 等。Blob 全称为 binary large object ,即二进制大对象,它是 JavaScript 中的一个对象

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!