logo科技微讯

~-10 为什么等于 9

作者:科技微讯
日期:2023-06-06
📝 笔记

在 Github 上看到一句话

~- is the bitwise way to perform a - 1 operation.

所以 ~-10 就是 10 - 1 = 9。

为什么呢?

首先 -10 是一体的,~-10 表示对 -10 执行 ~ 运算。

10 的二进制数字是 1010,因为它是正数,所以在前面加 0,变成 01010

-10 是在 10 的基础上把所有数字 revert 一次,10101,再加一,10110

最后 ~-10 就是 01001parseInt('01001',2) 得到 9。

在 js 中,bitwise 运算是把数字转换为 two's complement 的形式后再执行的运算,把 -10 转换为 two's complement 的形式的步骤:

  1. 先获得 -10 所对应的正数,即 10 的二进制数字,(10).toString(2) = 1010
  2. 因为 10 是正数,所以在最左边的位置增加 0,01010,因为在 two's complement 中,使用最左边的那位数字表示正数或负数,1 是负数,0 是正数;
  3. 对这个二进制数字的每一位进行 revert,10101
  4. 因为是负数,所以还要在 10101 的基础上加 1,10110,这就是 10 的 two's complement 形式;

注意 bitwise operator 只适用于整数,不适用于小数。在 c++ 中对小数执行 bitwise operator 会报错,在 js 中虽然不会报错,但会忽略小数部分。

const result = ~-10.5;
console.log(result) //9

相关文章:

  • js 的 setTimeout 支持的最大值:这里提到 js 使用 32-bit 或 64-bit 的二进制存储数字,可以表示整数和负数,注意和 two's complement 的区别,js 不是用 two's complement 的形式存储数字,只是在执行 bitwise 运算时才会把数字理解为 two's complement 的形式;
  • ~~10.5 为什么等于 10:因为 two's complement 会忽略小数部分;
donation赞赏
thumbsup0
thumbsdown0
暂无评论