77百科网
当前位置: 首页 生活百科

js正数转负数的函数(负数转16进制依据的规则)

时间:2023-06-02 作者: 小编 阅读量: 1 栏目名: 生活百科

为什么要做js位运算呢?ECMAScript整数有两种类型,即:,接下来我们就来聊聊关于js正数转负数的函数?以下内容大家不妨参考一二希望能帮到您!因为最近在学习hash算法,里面用到了大量的位运算另外网上也找了很多资料,但大都比较片面,没有说明特殊情况时的处理,换几组数据计算结果就出错。有符号整数使用31位表示整数的数值,用第32位表示整数的符号,0表示正数,1表示负数。数值范围从-2147483647到2147483647。

js正数转负数的函数?为什么要做js位运算呢?ECMAScript 整数有两种类型,即:,接下来我们就来聊聊关于js正数转负数的函数?以下内容大家不妨参考一二希望能帮到您!

js正数转负数的函数

背景

为什么要做js位运算呢?

  • 因为最近在学习hash算法,里面用到了大量的位运算
  • 另外网上也找了很多资料,但大都比较片面,没有说明特殊情况时的处理,换几组数据计算结果就出错。

重温整数

ECMAScript 整数有两种类型,即:

  • 有符号整数(允许用正数和负数)
  • 无符号整数(只允许用正数) 在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢?

有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。

数值范围从 -2147483647 到 2147483647。

位运算会把二进制数限制在32位,超出部分会被舍弃

调试位运算常用的几个方法

toString(2)

转换成2进制字符串

var a = 1732584193;a.toString(2); // 1100111010001010010001100000001

parseInt(‘11001’, 2)

将2进制字符串转换成10进制数

parseInt('11001', 2) // 25

padStart(32, ‘0’)

字符串总长度,左边不足位数补0

'1100000001'.padStart(32, 0) // 00000000000000000000001100000001

源码、反码、补码

源码

将数字转换成的2进制数, 最左边表示符号位,1负数,0正数

5 源码: 0101-10 源码:11010

反码

正数的反码与其原码相同

负数的反码,除符号位外,其他位取反

5 源码:0101反码:0101-10源码:11010 反码:10101

补码

正整数的补码与其原码相同

负整数的补码,取反码+1

5源码:0101补码:0101-10源码:11010补码:10110

ok,现在开始正题

位运算符

  • 非(~)
  • 与(&)
  • 或(|)
  • 异或(^)
  • 带符号左移(<<)
  • 带符号右移(>>)
  • 无符号右移(>>>)

位运算符:非(~)

运算步骤:

  1. 将该数字取负数
  2. 然后减1
~25 // -26

过程:

  • 25取负:-25
  • 减1:-26
~1// -2~-1 // 0~100 // -101~-100 // 99

位运算符:与(&)

运算步骤:

  1. 把两个数转换成2进制补码
  2. 相同位置进行比较(同为1,结果为1,否则为0)
  3. 如果计算结果是负数,还要再做补码处理

如果位数不够,正数左边补0,负数补1

正正运算

10 & 3 // 2

过程:

  • 10 补码:1010
  • 3 补码:0011
  • 结果:0010,即 2

正负运算(1)

14 & -13 // 2

过程:

  • 14 补码:01110(补一位符号位)
  • -13 源码:11101,补码:10011
  • 与运算:00010,即 2

正负运算(2)

88 & -19 // 72

过程:

  • 88 补码:01011000(补一位符号位)
  • -19 源码:110011,补码:101100
  • 01011000 & 101100
  • 负数(101100)位数不够,左边补1,即11101100
  • 也就是 01011000 & 11101100
  • 结果为:01001000,即:72

负负运算

-12 & -5 // -16

过程:

  • -12 补码:10100
  • -5 补码:11011
  • 与运算:10000
  • 结果为负,再取一次补码: 110000:-16

练习

3 & 7-21 & 16-271733879 & -17325841941125899778533470 & 81293020 & 0xF48192342 & 0xFFFF

位运算符:或(|)

运算步骤:

  1. 把两个数字转换成2进制补码
  2. 相同位置进行比较(有一个是1,结果即为1)
  3. 如果计算结果是负数,还要再做补码处理

正正运算

10 | 3 // 11

过程:

  • 10 源码:1010
  • 3 源码:0011
  • 结果:1011,即 11

正负运算

10 | -3 // -1

过程:

  • 10补码:01010
  • -3补码:11101
  • 或运算:11111
  • 结果为负,再取码:10001,即:-1

负负运算

-15 | -21 // -5

过程:

  • -15 补码:110001
  • -21 补码:101011
  • 或运算:111011
  • 结果为负再取补码:10101,即:-5

练习

15 | 2040 | -14-271733879 | 1732584193(-271733879 & -1732584194) | (~-271733879 & 271733878)

位运算符:异或(^)

运算步骤:

  1. 把两个数转换成2进制补码
  2. 相同位置进行比较(必须是0和1或者1和0,结果才为1)
  3. 如果结果为负,再取补码

正正异或

10 ^ 3 // 9

过程:

  • 10 补码:1010
  • 3 补码:0011
  • 结果:1001,即 9

正负异或

10 ^ -3 // -9

过程:

  • 10 补码: 01010
  • -3 补码:11101
  • 异或运算:10111
  • 结果为负,再取补码:11001,即-9

负负异或

-10 ^ -3 // 11

过程:

  • -10 补码:10110
  • -3 补码:11101
  • 异或运算:01011,即:11

练习

5 ^ 8-10 ^ 9-13 ^ -20-271733879 ^ -1732584194 ^ 271733878

位运算符:带符号左移(<<)

运算步骤:

  1. 把数字转换成2进制补码
  2. 左移指定位数,右边补0
  3. 如果结果未负数,再取补码

超过32位的部分舍弃

正数左移

1 << 2 // 补码:00000001 左移2位, 即 00000100,结果为:45 << 3 // 补码:00000101 左移3位, 即 00101000,结果为:40 

可以看出,正数带符号左移,即 a << n,其实是 a * 2的n次幂

负数左移

-3 << 4
  • -3 补码:101
  • 左移4位 1010000
  • 标志位为负,取补码:1110000,即-48
-6 << 3// 1010 << 3 等于 1010000,取补码,1110000 即:-48-11 << 4 // 10101 << 4 等于 101010000,取补码,110110000 即:-176

边缘情况

情况1:正数变负数

1732584193 << 2// -1659597820

计算过程

  • 1732584193转换成2进制源码:1100111010001010010001100000001(31位)
  • 左移2位,补2个0:110011101000101001000110000000100(33位)
  • 移除左边多余的1位:10011101000101001000110000000100(32位)
  • 变为负数,取补码:11100010111010110111001111111100
  • 即:-1659597820

情况2:负数变正数

-1732584193 << 2// 1659597820

计算过程

  • -1732584193转换成2进制:11100111010001010010001100000001(32位)
  • 负数,取补码:10011000101110101101110011111111(32位)
  • 左移2位:1001100010111010110111001111111100(34位)
  • 多余部分舍弃:01100010111010110111001111111100(32位)
  • 符号位为正,无需再补码,即:1659597820

练习

1 << 32 1 << 33 1 << 402147483648 << 21732584193 << 6

位运算符:带符号右移(>>)

运算步骤:

  1. 取数字二进制补码
  2. 右移指定位数,左边补位与符号位一致
  3. 多余位被舍弃
  4. 如果计算结果为负,再取补码

正数右移

5 >> 1 // 0101 右移1位 0010,即 21 >> 2 // 0001 右移1位 0000,即 0

正数右移比较简单,移出的内容直接舍弃即可,左边用0补充

负数右移

-5 >> 2 // -2

分析:

  • -5 补码:1011
  • 右移2位:1110
  • 结果为负,取补码:1010,即-2

练习

5 + 64 >> 91732584193 >> 4

位运算符:无符号右移(>>>)

运算步骤:

  1. 把数字转换成32位2进制补码
  2. 连同符号位,右移动指定的位数
  3. 向右被移出的位被丢弃,左侧用0填充

因为符号位变成了 0,所以结果总是正的

正数右移

正数时候 >> 和 >>> 结果是一样的

5 >> 2 // 101 右移2位 001 即:15 >>> 2 // 101 右移2位 001 即:1

负数右移

-5 >>> 2 // 1073741822

过程:

  • -5 源码: 10000000 00000000 00000000 00000101
  • 补码:11111111 11111111 11111111 11111011
  • 右移两位:00111111 11111111 11111111 11111110
  • 转换成十进制即为:1073741822

问题:为什么这个要补满32位,而之前的运算都没有?

因为之前的运算,正数补的都是0,负数虽然补1,但计算后要做补码,补位的数最终不影响计算

而无符号右移,则会影响运算。所以需要补全

练习

-23 >>> 245678765 >>> 31

关于位运算的核心思路

  • 运算前要取补码
  • 运算结果导致负数,再取一次补码

以上内容都是个人收集、以及多次尝试整理的。

因为网上看到的很多文章计算方式都不对,虽然举的例子没问题,但换机组数字就计算错误。

    推荐阅读
  • 广东省高考提前批补录在哪填(广东高考生需知)

    小粤在这里要跟破除这个想法,提前批的设立的目的是为了把一些特殊类型的考生先录取完,再进行普通高考考生的录取。因此这不等同于在提前批次的院校便是好的院校,也会出现个别差的师范类学校进行提前招生!以上便是粤升学就提前批的一些相关讲解,希望能对于想报考提前批的学子有帮助!

  • 生化危机2重制版真结局怎么做(生化危机2重制版完美结局)

    根据官方的消息生化2重制版将会包涵4个结局,那么不少玩家就想知道游戏的真正结局是什么呢?推荐阅读:生化危机2重制版全收集攻略生化危机2里昂流程攻略生化2重制版真结局达成方法1.在一周目的时候任意使用里昂或者克莱尔通关一次游戏。选择该模式进行“B”路线。

  • 哈芬槽取名分数119分

    文章目录:一、哈芬槽相关名字打分95二、哈芬槽相关名字评分101三、哈芬槽相关名字推荐四、哈芬槽相关名字大全五、其他人还看了一、哈芬槽相关名字打分95哈正利哈萨德哈瓦特哈尔法哈尔顿哈布尔哈鲁哈表所哈亚特哈你哈啾嗨哈高中哈飞牌哈拉海哈曾哈该哈弗或哈堂客哈瑙哈仙岛哈屯哈尔齐哈露哈蜜蜜哈磊哈扎德哈约克哈乐城哈金哈萨尔哈联科哈咯面哈菜谱哈酸乳哈瓦西哈攀龙哈蚧哈琳哈姆雷哈比鹰哈萨哈西娜哈二哈爸哈金龙哈工程哈

  • 熟鸭架汤的做法窍门(熟鸭架汤的烹饪方法)

    熟鸭架汤的做法窍门材料:鸭骨架1具,猪肉200克,生藕500克,干冬菇200克,干笋50克,栗子、红枣各10个,莲子30粒,海米20粒,葱段50克,姜片50克,细盐、糖、绍酒、味精各适量。猪肉洗净,切成两块。冬菇用水浸泡,择净。汤锅内加清水4000克,置旺火上,将鸭骨架、猪肉、藕、冬菇、干笋、海米、葱、姜、料酒、糖同时放入汤锅,待汤开后,再用微火煮1小时。再放细盐、栗子、莲子、红枣煮1小时即可起锅。上桌时加入味精。

  • 脖子粗怎么瘦下来(脖子粗瘦下来的方法)

    跟着小编一起来看一看吧!脖子粗怎么瘦下来每天做颈部运动。每晚在淋浴中涂抹颈霜按摩。养成每周在脖子上涂面膜的习惯。选择身高约8厘米的枕头,以减轻睡眠时颈部的压力。颈部保养:记得每晚在颈部护理后都要穿上保湿霜,从底部到顶部按摩20-30,直到乳液完全吸收。这也可以使脖子变薄。

  • 多肉植物怎样度过夏天,需要注意什么

    夏天是很多肉友最头疼的季节,因为多肉在夏天十分容易死亡,那么多肉植物要怎么度过夏天呢?首先要确保没有直射的光照,但是要有散射光照,其次要有良好的通风,在这样的环境中,多肉才能更加安全的度过夏天。控制浇水多肉在炎热的夏季会进入休眠,这时候多肉的生理活动基本上已经停止了,所以对水分的消耗也会逐渐的降低,这样要求我们减少给多肉浇水的次数和量,否则多肉植物很容易因为积水而出现根部腐烂的情况。

  • 房子住久了后悔了(房子越住越烦恼)

    突破普通住宅的点式布局,采用纯板设计;户型方正实用,各空间尺寸合理,可最大限度避免面积浪费;面宽与进深保持1:1.5的黄金比例,让通风采光始终俱佳。卫生间干湿分离的设计,使得入浴与洗漱各自私享的同时减轻住户家务负担。快来碧桂园经典户型YJ140解锁幸福居家生活吧!

  • 2021溱湖簖蟹开捕时间+地点+活动详情 溱湖簖蟹产地在哪

    图源:图虫网2021溱湖簖蟹开捕仪式:活动时间:10月1日活动地点:溱湖风景区入口广场心动秒杀:新鲜现捞的溱湖簖蟹网红直播间开售,200只簖蟹,限时抢购,心动价格,抢到就是赚到蟹趣比赛:活动现场即可报名参与簖蟹趣味比赛,比比谁选的簖蟹,能更快冲刺4M赛道,获胜者还能赢得鲜美簖蟹一对哦!琳琅满目的溱湖特色湖鲜,等你来品鉴。还有菱角、莲藕等绿色生态农产品,任君挑选,放心购买。

  • 中医认为几天洗一次澡(几天洗一次澡比较好)

    下面内容希望能帮助到你,我们来一起看看吧!中医认为几天洗一次澡如果是一般性的冲洗,每天冲洗一下就可以。当然不能用太热的水洗烫,还有洗的时间过长或者用搓澡巾搓,一般一个月搓一次,不能多于一次。皮肤的代谢是28天一个周期,所以不能搓太多,一个月顶多能搓一次。洗澡时注意千万不要长时间弯腰。以免脑部充血,可在浴室放张凳子,需要低头时可以坐在凳子上,尽量避免弯腰之类的动作。

  • 哪些人不能吃八角鱼(什么人不能吃八角鱼)

    我们一起去了解并探讨一下这个问题吧!哪些人不能吃八角鱼无特殊禁忌人群。八角鱼,为辐鳍鱼纲鲉形目杜父鱼亚目八角鱼科的其中一种,为温带海水鱼,分布于东北大西洋区。八角鱼从白海、冰岛、英吉利海峡至波罗的海南部海域,栖息深度0-270米,体长可达21厘米,栖息在近岸砂底质底层水域,以甲壳类及多毛类为食,繁殖期在2至4月,卵产在海草,卵数量2500-3000颗,可作为观赏鱼。