关于JS中number位(Bit)操作的一些思考

本文探讨了JavaScript中位操作符在32位带符号整数中的应用,包括利用位与(&)判断奇偶,位或(|)进行取整,以及结合位操作的打标模式。详细解释了32位整数的表示方式,通过实例展示了如何通过位操作进行数值转换和状态标记,简化权限管理等业务场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  JavaScript中所有的数字都按照IEEE-754标准储存为64位。但是位操作符却是转换为32位数字进行操作的。关于这一点的可用性进行了一些思考。

32带符号整数

  先来复习一下32带符号整数的数据表示方式。在计算机中,所有的数据都是被储存为0和1的序列,数字也不例外。比如数字4,通过二进制转换,储存为100。但是整数在实际业务场景中是存在正负的,如何用01序列来表示一个负数呢。我们可以拿出一个位置,用0或者1来标志这个数字是整数还是负数。

  在JS的32带符号整数中,数字从左边的第一位用于标识正负数(1表示负数,0表示整数)。在用二进制转换完毕后,用0补齐不足32位的部分。比如数字8的二进制为1000。我们先用0补齐到31位0000000000000000000000000001000,然后在左边第一位放上表示正负的位数,8是正数放上0,因此8在32带符号整数中为00000000000000000000000000001000

  而如果我们要表示一个负数,比如-18,我们需要先找到该负数的绝对值1832带符号整数中的01序列,为00000000000000000000000000010010,然我们把所有位上面的数字取反,转为11111111111111111111111111101101。然后我们把它加上1,得到11111111111111111111111111101110就是18在32带符号整数中的表示。我们可以在控制台中验证一下:

console.log(0b11111111111111111111111111101110 | 0); // -18
0b11111111111111111111111111101110; // 4294967278

  在这里0b起头表示后续的数字是以二进制方式来储存。|位操作,表示同等级位上有1个以及以上的1为1,否则为0,因此| 0表示为取原数值。但是因为位操作符建立在32带符号整数的规则上,这里| 0实际上的含义是把前面的数值转换为32带符号整数。因此我们看到我们直接运算0b11111111111111111111111111101110得到的结果是4294967278而不是-18

  位操作符是建立在32位带符号整数操作上进行的,我们还可以通过最大值的方式很简单的证明。

<think>好的,我现在要回答用户的问题:“浮点型是什么意思”。首先,我需要回顾一下之前用户的问题,之前是关于字符串常量是否都有结束符,而这次转向了浮点型。可能用户在学习编程基础知识,正在了解不同的数据类型。 接下来,我要确保自己对浮点型的理解正确。浮点型是一种数据类型,用于表示有小数点的数字,也就是实数。在计算机中,浮点数的存储方式遵循IEEE 754标准,分为符号、指数部分和尾数部分。需要解释清楚浮点数的结构,以及为什么需要这种表示方法。 然后,用户可能想知道浮点型和其他数据类型(比如整型)的区别。比如,整型只能表示整数,而浮点型可以表示小数。另外,浮点数的精度问题也是一个重点,比如为什么有些小数无法精确表示,导致舍入误差。 还要考虑用户可能的实际应用场景,比如在编程中使用浮点型进行数值计算时的注意事项,比如避免直接比较两个浮点数是否相等,而应该比较它们的差值是否在一个很小的范围内。 另外,不同编程语言中浮点型的实现可能有所不同,比如C语言中的float和double,Python中的float类型,JavaScript中的Number类型等。需要简要说明这些差异,但不要过于深入,以免让用户感到混乱。 可能用户还会有一些常见的误区,比如认为浮点型可以精确表示所有小数,或者不理解为什么有时候计算结果会有微小的误差。需要提前预见到这些问题,并在回答中进行解释,帮助用户避免常见的错误。 最后,确保回答结构清晰,分点说明,使用例子帮助理解,语言通俗易懂,避免使用过于专业的术语,或者在必要时解释术语。同时,结合之前的回答风格,用户喜欢对比不同语言的情况,比如在之前的回答中对比了C、Java、Python等,所以在这次回答中也可以提到不同语言中的浮点型实现,但重点还是解释浮点型的基本概念。 检查是否有遗漏的重要点,比如浮点数的范围、精度限制、特殊值(如NaN,Infinity)等。这些内容对用户全面理解浮点型也很重要,但需要以简洁的方式呈现,避免信息过载。 总结思考步骤:定义浮点型,解释其在计算机中的表示,对比其他数据类型,讨论精度问题,举例说明在不同语言中的应用,常见误区及注意事项,最后总结其重要性和使用场景。</think>--- ### **浮点型(Float)的定义** **浮点型**是计算机中用于表示**实数**(含小数点的数)的数据类型,通过**科学记数法**(如 $1.23 \times 10^4$)存储数值,支持表示极大或极小的数。 其名称源于小数点可以“浮动”——通过调整指数部分,改变小数点的置。 --- ### **浮点型的核心原理** 计算机中浮点数遵循 **IEEE 754标准**,由三部分构成: 1. **符号(Sign)**:1 bit,表示正负(0为正,1为负)。 2. **指数(Exponent)**:决定数值的范围(如 $2^{8}$)。 3. **尾数(Mantissa/Significand)**:存储有效数字(如 $1.0101$)。 **示例**:单精度浮点数(32) $$ \text{值} = (-1)^{\text{符号}} \times (1 + \text{尾数}) \times 2^{\text{指数} - 127} $$ --- ### **浮点型 vs 整型(Integer)** | 特性 | 浮点型 | 整型 | |--------------|--------------------------|--------------------| | **表示范围** | 极大或极小(如 $10^{308}$) | 固定范围(如 $-2^{31} \sim 2^{31}-1$) | | **精度** | 可能丢失(如无法精确表示 $0.1$) | 绝对精确 | | **存储方式** | 科学记数法(符号+指数+尾数) | 直接二进制补码 | --- ### **浮点型的精度问题** 由于二进制存储限制,某些十进制小数无法精确表示,例如: - **经典问题**: ```python 0.1 + 0.2 == 0.3 # 结果为False(实际计算值约为0.30000000000000004) ``` - **原因**:$0.1$ 在二进制中是无限循环小数,存储时会被截断,导致微小误差。 **解决方法**: - 避免直接比较浮点数是否相等,改用误差范围(如 `abs(a - b) < 1e-9`)。 - 需要高精度计算时,使用十进制库(如Python的`decimal`模块)。 --- ### **不同语言中的浮点型** 1. **C/C++** - `float`(单精度,32) - `double`(双精度,64,默认类型) ```c float a = 3.14f; // 必须加f后缀 double b = 2.718; // 默认双精度 ``` 2. **Python** - 只有 `float` 类型(默认双精度),支持科学记数法: ```python x = 3.14 y = 6.022e23 # 6.022 × 10²³ ``` 3. **JavaScript** - 所有数值均为双精度浮点型(`Number`类型): ```javascript let num = 0.1 + 0.2; // 结果为0.30000000000000004 ``` --- ### **浮点型的特殊值** | 值 | 含义 | 示例(Python) | |-----------|------------------------|---------------------------| | **Inf** | 无穷大(如1/0) | `float('inf')` | | **-Inf** | 负无穷大(如-1/0) | `-math.inf` | | **NaN** | 非数值(如0/0) | `float('nan')` | --- ### **使用注意事项** 1. **避免循环累加浮点数**:误差会累积。 2. **优先使用双精度**(如`double`):精度更高。 3. **注意平台差异**:不同硬件对IEEE 754的实现可能略有不同。 --- ### **总结** 浮点型是计算机科学中**表示实数的核心数据类型**,特点是: - 能表示极大/极小的数,但存在精度损失风险。 - 需理解其存储原理和误差来源,合理规避计算陷阱。 - 在科学计算、图形渲染、金融(需谨慎)等领域广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值