>參考:知乎作者@我是個AI?
浮點數(shù)位運算
乘基數(shù)取整法:
1.將該數(shù)字乘以2寺谤,
2.取出整數(shù)部分作為二進制表示的第1位榛搔;
3.然后再將小數(shù)部分乘2,將得到的整數(shù)部分作為二進制表示的第2位说贝;
4.?重復(fù)前三步操作
以此類推
0.6 * 2 = 1.2 —————> 1?
0.2 * 2 = 0.4 —————> 0?
0.4 * 2 = 0.8 —————>0?
0.8 * 2 = 1.6 —————> 1?
0.6 * 2 = 1.2 —————> 1?
…………
如果時2.6的話
整數(shù)部分:10
小數(shù)部分:100110011001....
則二進制表示為: 10.10011001...........
number|0取整
1议惰、標準。JavaScript采用的IEEE754標準作為數(shù)字存儲標準
采用IEEE754也是JavaScript天生就帶bug的淵源了
2狂丝、IEEE754規(guī)定雙精度數(shù)值以64位存儲换淆,其中1位為符號位,11位為指數(shù)位几颜,剩余52位為尾數(shù)為
不知道指數(shù)位和尾數(shù)位倍试、符號位的自行找計算機組成原理充電
SPPP PPPP PPPPTTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT TTTT
S:符號位
P:指數(shù)位
T:尾數(shù)位
對于無符號數(shù)值,則位11位指數(shù)位蛋哭,53位尾數(shù)位
3县习、JavaScript的位運算以32二進制執(zhí)行
進行位運算時,先將數(shù)值轉(zhuǎn)換成32位有符號整數(shù)(重點:整數(shù))谆趾,既然取整了躁愿,自然就去除了小數(shù)部分了
// 這里才是重要的letfloatNum=10/3;console.log(floatNum);// 3.3333333333333335console.log(floatNum.toString(2));// 轉(zhuǎn)換成二進制表示的字符串// "11.010101010101010101010101010101010101010101010101011"letintNum=floatNum|0;console.log(intNum);// 3console.log(intNum.toString(2));// "11"
那么floatNum和0進行或運算后,舍棄了小數(shù)部分沪蓬,二進制也由原來的妖妖點XXXX變成了妖妖
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0000
上面的3和下面的0進行與運算彤钟,也即是全部保留3的位數(shù)據(jù),最終還是3啦
所以主要| 0的操作主要是看中了取整的功能跷叉,位運算的不是主要看點
Note:好高級的樣子逸雹?但是我不建議你這么用
1、可讀性低云挟,沒有注釋別人不知道你在干嘛
2梆砸、丟失高位數(shù)據(jù),原本52(或53)位的數(shù)據(jù)园欣,被舍棄掉高位的21(或22位)的數(shù)據(jù)帖世,非常危險
作者:__唐一__
鏈接:http://www.reibang.com/p/9a1b6610077d