摘要:心血來潮地跑到做了個(gè),結(jié)果當(dāng)然是慘不忍睹,發(fā)現(xiàn)自己對(duì)不少的基礎(chǔ)知識(shí)的理解是模模糊糊,甚至是錯(cuò)的。讀到又琢磨了一會(huì)兒,才搞明白為啥補(bǔ)碼這么反直覺。二補(bǔ)碼只能腦補(bǔ),或者用代碼打印腦補(bǔ)的內(nèi)容。寫了半天,一言以蔽之相當(dāng)于調(diào)用參考鏈接
心血來潮地跑到Upworks做了個(gè)JavaScript Test,結(jié)果當(dāng)然是慘不忍睹,發(fā)現(xiàn)自己對(duì)不少JavaScript的基礎(chǔ)知識(shí)的理解是模模糊糊,甚至是錯(cuò)的。
比如這題:
~-(2+"2")
這個(gè)表達(dá)式的值是21,我腦補(bǔ)了好久也得不到這個(gè)答案,這才發(fā)現(xiàn),我完全不理解Bitwise NOT操作符。
不懂就補(bǔ)嘍。
這回還真是“補(bǔ)”,回想起大學(xué)那會(huì)兒,學(xué)到“補(bǔ)碼”時(shí),腦子里就是一團(tuán)霧,原來那團(tuán)迷霧到今天也沒散,真他么黏糊。
讀到 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
又琢磨了一會(huì)兒,才搞明白為啥補(bǔ)碼這么反直覺。
“二補(bǔ)碼”只能腦補(bǔ),或者用代碼打印腦補(bǔ)的內(nèi)容。
在JavaScript里,如果用number.toString(2),結(jié)果是這樣:
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
這個(gè)結(jié)果符合直覺,但加法器的實(shí)現(xiàn)只會(huì)使用二補(bǔ)碼,下面是加法器實(shí)際使用的“二補(bǔ)碼”:
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
理解了二補(bǔ)碼,再來看-22怎么被補(bǔ)成21的:
Decimal: -22 | Binary: 11111111111111111111111111101010 -> Decimal: 21 | Binary: 00000000000000000000000000010101
Python對(duì)此解釋得更直接:
~ 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.
我連補(bǔ)碼都沒鬧明白,竟然過了關(guān)還Score top 30%,可見其他人都沒作弊,我真是無恥的程序員。
寫了半天,一言以蔽之:
~x 相當(dāng)于調(diào)用
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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92180.html
摘要:雖然需要轉(zhuǎn)換,但這個(gè)過程與其他數(shù)學(xué)運(yùn)算和布爾操作相比要快很多。位掩碼位掩碼用于處理同時(shí)存在多個(gè)布爾選項(xiàng)的情形。使用單個(gè)數(shù)字的每一位來判定選項(xiàng)是否成立,從而有效地把數(shù)字轉(zhuǎn)換為由布爾值標(biāo)記組成的數(shù)組。 位操作 JavaScript中的數(shù)字都按照IEEE-754(Institute of Electrical and Electronics Engineers)標(biāo)準(zhǔn)以64位格式存儲(chǔ)。在位操作...
摘要:另外自己寫代碼測試了下和的速度,比較結(jié)果如下位操作轉(zhuǎn)換整數(shù)的原理參考上面對(duì)于位操作的說明,點(diǎn)擊下面鏈接有這樣一段話中,數(shù)字存儲(chǔ)是雙進(jìn)度位浮點(diǎn)數(shù)。但是位操作卻會(huì)把要操作的運(yùn)算元當(dāng)做位帶符號(hào)的整數(shù)。因此進(jìn)行位操作時(shí),會(huì)自動(dòng)把數(shù)字先轉(zhuǎn)換為整數(shù)。 本文將會(huì)列舉并說明JavaScript 把一個(gè)number(或者numerical的對(duì)象)轉(zhuǎn)換成一個(gè)整數(shù)相關(guān)方法。 使用parseInt parse...
摘要:題目要求給一個(gè)閉區(qū)間,對(duì)該閉區(qū)間的所有數(shù)字進(jìn)行與運(yùn)算。在計(jì)算機(jī)底層所有的十進(jìn)制數(shù)都是以二進(jìn)制數(shù)進(jìn)行存儲(chǔ)的。因此,當(dāng)我們同時(shí)左移時(shí),一定會(huì)有一個(gè)時(shí)刻,使得與相等。這意味著,從該位起前面的所有位數(shù)值均相等。 題目要求 Given a range [m, n] where 0 >>和= 1 ; n >>>= 1; } return m>...
閱讀 3973·2021-10-09 09:43
閱讀 2880·2021-10-08 10:05
閱讀 2740·2021-09-08 10:44
閱讀 889·2019-08-30 15:52
閱讀 2817·2019-08-26 17:01
閱讀 3024·2019-08-26 13:54
閱讀 1657·2019-08-26 10:48
閱讀 815·2019-08-23 14:41