摘要:心血来潮地跑到做了个,结果当然是惨不忍睹,发现自己对不少的基础知识的理解是模模糊糊,甚至是错的。读到又琢磨了一会儿,才搞明白为啥补码这么反直觉。二补码只能脑补,或者用代码打印脑补的内容。写了半天,一言以蔽之相当于调用参考链接
心血来潮地跑到Upworks做了个JavaScript Test,结果当然是惨不忍睹,发现自己对不少JavaScript的基础知识的理解是模模糊糊,甚至是错的。
比如这题:
~-(2+"2")
这个表达式的值是21,我脑补了好久也得不到这个答案,这才发现,我完全不理解Bitwise NOT操作符。
不懂就补喽。
这回还真是“补”,回想起大学那会儿,学到“补码”时,脑子里就是一团雾,原来那团迷雾到今天也没散,真他么黏糊。
读到 Why is ~5 === -6 in JavaScript?:
It does indeed perform a bit-wise NOT, the negative number is in two"s complement. So the value 1010 is -6.Two"s complement basically works by the very left-most bit signifies a negative number and is taken as a negative value. All other 1 bits are added to this number. For example:
1010 => (-8 +0 +2 +0) => -6
1111 => (-8 +4 +2 +1) => -1
又琢磨了一会儿,才搞明白为啥补码这么反直觉。
“二补码”只能脑补,或者用代码打印脑补的内容。
在JavaScript里,如果用number.toString(2),结果是这样:
Decimal: 5 | Binary: 00000000000000000000000000000101 Decimal: 4 | Binary: 00000000000000000000000000000100 Decimal: 3 | Binary: 00000000000000000000000000000011 Decimal: 2 | Binary: 00000000000000000000000000000010 Decimal: 1 | Binary: 00000000000000000000000000000001 Decimal: 0 | Binary: 00000000000000000000000000000000 Decimal: -0 | Binary: 00000000000000000000000000000000 Decimal: -1 | Binary: 000000000000000000000000000000-1 Decimal: -2 | Binary: 00000000000000000000000000000-10 Decimal: -3 | Binary: 00000000000000000000000000000-11 Decimal: -4 | Binary: 0000000000000000000000000000-100 Decimal: -5 | Binary: 0000000000000000000000000000-101
这个结果符合直觉,但加法器的实现只会使用二补码,下面是加法器实际使用的“二补码”:
Decimal: 5 | Binary: 00000000000000000000000000000101 Decimal: 4 | Binary: 00000000000000000000000000000100 Decimal: 3 | Binary: 00000000000000000000000000000011 Decimal: 2 | Binary: 00000000000000000000000000000010 Decimal: 1 | Binary: 00000000000000000000000000000001 Decimal: 0 | Binary: 00000000000000000000000000000000 Decimal: -0 | Binary: 00000000000000000000000000000000 Decimal: -1 | Binary: 11111111111111111111111111111111 Decimal: -2 | Binary: 11111111111111111111111111111110 Decimal: -3 | Binary: 11111111111111111111111111111101 Decimal: -4 | Binary: 11111111111111111111111111111100 Decimal: -5 | Binary: 11111111111111111111111111111011
理解了二补码,再来看-22怎么被补成21的:
Decimal: -22 | Binary: 11111111111111111111111111101010 -> Decimal: 21 | Binary: 00000000000000000000000000010101
Python对此解释得更直接:
~ x
Returns the complement of x - the number you get by switching each 1 for a 0 and each 0 for a 1.
This is the same as -x - 1.
我连补码都没闹明白,竟然过了关还Score top 30%,可见其他人都没作弊,我真是无耻的程序员。
写了半天,一言以蔽之:
~x 相当于调用
function twosComplement(x){ return 0 -x - 1; }
参考链接:
Why is ~5 === -6 in JavaScript?
Why does bitwise “not 1” equal -2?
MDN Bitwise operators
Python"s bitwise operators.
Two"s Complement
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/92180.html
摘要:虽然需要转换,但这个过程与其他数学运算和布尔操作相比要快很多。位掩码位掩码用于处理同时存在多个布尔选项的情形。使用单个数字的每一位来判定选项是否成立,从而有效地把数字转换为由布尔值标记组成的数组。 位操作 JavaScript中的数字都按照IEEE-754(Institute of Electrical and Electronics Engineers)标准以64位格式存储。在位操作...
摘要:另外自己写代码测试了下和的速度,比较结果如下位操作转换整数的原理参考上面对于位操作的说明,点击下面链接有这样一段话中,数字存储是双进度位浮点数。但是位操作却会把要操作的运算元当做位带符号的整数。因此进行位操作时,会自动把数字先转换为整数。 本文将会列举并说明JavaScript 把一个number(或者numerical的对象)转换成一个整数相关方法。 使用parseInt parse...
摘要:实现图像的叠加,需要综合运用图像阈值处理图像掩模位操作和图像加法的操作。使用位操作生成前景背景图像时,遮罩区域以外与进行自与操作,如果用自或操作参见程序注释语句的效果也是相同的。该方法通过固定阈值处理图像,将像素点的灰度值设为或。 ...
摘要:题目要求给一个闭区间,对该闭区间的所有数字进行与运算。在计算机底层所有的十进制数都是以二进制数进行存储的。因此,当我们同时左移时,一定会有一个时刻,使得与相等。这意味着,从该位起前面的所有位数值均相等。 题目要求 Given a range [m, n] where 0 >>和= 1 ; n >>>= 1; } return m>...
摘要:基于的增强现实胡子挂件融合第一个项目中,我们将在检测到的脸上覆盖了一个小胡子。如果处理的目标是连续视频帧,在处理完成所有检测到的人脸后,将继续分析下一帧。根据上述描述,程序应当首先检测图像中的人脸和鼻子。 ...
摘要:如果不设置这个,图片只会一瞬间显示,就消失了。括号里面也可以设置显示时长。 目录 1、概述 2、OpenCV基础 读取图片 imread 调整显示窗口大小 resizeWindow 调整图像尺寸大小 resize 色彩空间进行转换 cvtColor 绘制线段 line 绘制矩形框 recta...
阅读 3484·2021-10-09 09:43
阅读 2598·2021-10-08 10:05
阅读 2241·2021-09-24 09:48
阅读 2502·2021-09-08 10:44
阅读 772·2019-08-30 15:52
阅读 2650·2019-08-26 17:01
阅读 2868·2019-08-26 13:54
阅读 1535·2019-08-26 10:48