摘要:將任一數(shù)值與執(zhí)行按位與操作,其結(jié)果都為。中應(yīng)用判斷奇偶性偶數(shù)奇數(shù)按位異或規(guī)則每一位都不同,結(jié)果才為將任一數(shù)值與進(jìn)行異或操作,其結(jié)果為。
位運(yùn)算在算法中很有用,速度可以比四則運(yùn)算快很多。
To2orTo10JS中十進(jìn)制轉(zhuǎn)二進(jìn)制: (val).toString(2)
JS中二進(jìn)制轉(zhuǎn)十進(jìn)制: parseInt(val, 2)
JS中規(guī)定安全整數(shù)的范圍是-2^53~2^53,所以大于9007199254740991的數(shù)進(jìn)制轉(zhuǎn)換會(huì)存在精度問題
讀取的十進(jìn)制是根據(jù)原碼來讀取,而在內(nèi)存中,數(shù)值都是以二進(jìn)制補(bǔ)碼形式保存的
十進(jìn)制-5的二進(jìn)制表示為:1000,0101(原碼)
原碼除符號(hào)位外,全部取反再+1:11111011(補(bǔ)碼,內(nèi)存存儲(chǔ)形式)
~-5的結(jié)果:
正數(shù)的補(bǔ)碼和原碼一樣
負(fù)數(shù)原碼補(bǔ)碼轉(zhuǎn)換規(guī)則:
符號(hào)位不動(dòng),從低位往高位數(shù),遇到第一個(gè)1之前,包括第一個(gè)1不作任何取反,之后,每位都取反。避免了原碼轉(zhuǎn)反碼再轉(zhuǎn)補(bǔ)碼的繁瑣。
{原碼符號(hào)位不變} + {數(shù)值位按位取反后+1}
{原碼符號(hào)位不變} + {數(shù)值位從右邊數(shù)第一個(gè)1及其右邊的0保持不變,左邊安位取反}
// 7 00000111 // 原碼 00000111 // 補(bǔ)碼 // -6 10000110 // 原碼 11111010 // 補(bǔ)碼 // {原碼符號(hào)位不變} + {數(shù)值位從右邊數(shù)第一個(gè)1及其右邊的0保持不變,左邊安位取反} // -6 10000110 // 原碼 11111001 // 反碼 11111010 // 補(bǔ)碼 // {原碼符號(hào)位不變} + {數(shù)值位按位取反后+1}
進(jìn)行按位操作,都是針對(duì)補(bǔ)碼去操作。
十進(jìn)制轉(zhuǎn)二進(jìn)制
1 1 2 10 3 11 4 100 5 101 6 110 7 111 8 1000
64 64 / 2 = 32 -> 0 32 / 2 = 16 -> 0 16 / 2 = 8 -> 1000 // 轉(zhuǎn)為二進(jìn)制為:100000 // 十進(jìn)制 33 可以看成是 32 + 1 ,并且 33 應(yīng)該是六位二進(jìn)制的(因?yàn)?33 近似 32,而 32 是 2 的五次方,所以是六位),那么 十進(jìn)制 33 就是 100001 ,只要是 2 的次方,那么就是 1否則都為 0
二進(jìn)制轉(zhuǎn)十進(jìn)制
二進(jìn)制100001同理,首位是2^5(1) ,末位是2^0(0),相加得出33(只要是 2 的次方,那么就是 1否則都為 0)
按位非(~) 取反將1(原碼)轉(zhuǎn)二進(jìn)制: 00000001
按位取反: 11111110
將符號(hào)位之外的其它數(shù)字取反[符號(hào)位(即最高位)為1(表示負(fù)數(shù))]: 10000001
末位加1取其補(bǔ)碼: 10000010
轉(zhuǎn)換會(huì)十進(jìn)制: -2
00000001 // 原碼 11111110 // 按位取反 10000001 // 除符號(hào)位取反 10000010 // +1
對(duì)任一數(shù)值 x 進(jìn)行按位非操作的結(jié)果為 -(x + 1), 例如:2 -> -3
JS中的作用是配合indexOf():
indexOf找到一個(gè)給定元素的第一個(gè)索引,如果不存在,則返回-1, -1取反操作等于0,其它取反操作不等于0
if (~arr.indexOf(v)) if (arr.includes(v)) if (~str.indexOf(v)) if (str.indexOf(v) !== -1)按位或(|)
規(guī)則:其中一位為 1,結(jié)果就是 1
8 | 7 00001000 00000111 ---------- 00001111 // 15
任一數(shù)值 x 與 0 進(jìn)行按位或操作,其結(jié)果都是 x:
6 | 0 00000110 00000000 --------- 00000110 // 6
任一數(shù)值 x 與 -1 進(jìn)行按位或操作,其結(jié)果都為 -1:
6 | -1 00000110 10000001 --------- 10000111
將任一數(shù)值 x 與 0 進(jìn)行按位或操作,其結(jié)果都是 x。將任一數(shù)值 x 與 -1 進(jìn)行按位或操作,其結(jié)果都為 -1
JS中向下取整Math.floor, 返回小于或等于一個(gè)給定數(shù)字的最大整數(shù)
num | 0 or Math.floor(num)
Math.floor(45.95); // 45.95 | 0 // 45 Math.floor(45.05); // 45.05 | 0 // 45 Math.floor(4); // 4 | 0 // 4 Math.floor(-45.05); // -45.05 | 0 // -46 Math.floor(-45.95); // -45.95 | 0 // -46
1 | 0 ; // 1 1.1 | 0 ; // 1 "asfdasfda" | 0 ; // 0 0 | 0 ; // 0 (-1) | 0 ; // -1 (-1.5646) | 0 ; // -1 [] | 0 ; // 0 ({}) | 0 ; // 0 "123456" | 0 ; // 123456 1.23E2 | 0; // 123 1.23E12 | 0; // 1639353344 -1.23E2 | 0; // -123 -1.23E12 | 0; // -1639353344按位與(&)
規(guī)則:每一位都為 1,結(jié)果才為 1
8 & 7 // 0 00001000 00000111 00000000 // 0
將任一數(shù)值 x 與 0 執(zhí)行按位與操作,其結(jié)果都為 0。將任一數(shù)值 x 與 -1 執(zhí)行按位與操作,其結(jié)果都為 x。
JS中應(yīng)用:
判斷奇偶性
10 & 1 // 0 偶數(shù) 11 & 1 // 1 奇數(shù)按位異或 (^)
規(guī)則:每一位都不同,結(jié)果才為 1
8 ^ 7 // 15 1000 0111 1111 // 15 8 ^ 8 // 0 1000 1000 0000 // 0
將任一數(shù)值 x 與 0 進(jìn)行異或操作,其結(jié)果為 x。將任一數(shù)值 x 與 -1 進(jìn)行異或操作,其結(jié)果為-x
不進(jìn)位加法:
根據(jù)按位異或的特性就是不進(jìn)位加法: 8 ^ 8 = 0 如果進(jìn)位了,就是 16 了,所以只需要將兩個(gè)數(shù)進(jìn)行異或操作,然后進(jìn)位。那么也就是說兩個(gè)二進(jìn)制都是1的位置,左邊應(yīng)該有一個(gè)進(jìn)位1
JS中應(yīng)用:
交換二個(gè)數(shù)值
let a = 3 let b = 4 a ^= b b ^= a a ^= b有符號(hào)右移 (>>)
將第一個(gè)操作數(shù)向右移動(dòng)指定的位數(shù),向右被移出的位被丟棄,正數(shù)則在高位補(bǔ)零,負(fù)數(shù)則補(bǔ)1
9 >> 2 00001001 // 移動(dòng)二位, 以0填充 00000010 // 2 -9 >> 2 10001001 // 原碼 11110111 // 補(bǔ)碼 11111101 // 補(bǔ)碼右移 10000011 // 原碼 // -3
公式:int v = a / (2 ^ b)
JS中的應(yīng)用:
任何小數(shù) 把它>> 0可以取整
9.99 >> 0 // 9 9 >> 0 // 9 9.19 >> 0 // 9
除法運(yùn)算:
9 >> 1 // 4 8 >> 1 // 4
二分算法中取中間值:
13 >> 1 // 6 12 >> 1 // 6topic
兩個(gè)數(shù)不使用四則運(yùn)算得出和
a + b = (a ^ b) + ((a & b) << 1)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100460.html
摘要:總結(jié)對(duì)于原二進(jìn)制數(shù)來說,是不變,是反轉(zhuǎn)。的位數(shù)對(duì)應(yīng)原二進(jìn)制數(shù)的位數(shù),對(duì)各位進(jìn)行屏蔽,全部置。左移左移與右移比較類似,是將目標(biāo)二進(jìn)制數(shù)字向左右移動(dòng)相應(yīng)的位數(shù)。語言中的邏輯運(yùn)算符按位與,按位或,按位異或,取反,左右移位不完全手冊(cè)立創(chuàng)開源 ...
摘要:有符號(hào)的右移操作符由兩個(gè)大于符號(hào)表示這個(gè)操作符的含義就是將數(shù)值的位向右移指定的位數(shù)同時(shí)保留符號(hào)位的值正負(fù)號(hào)標(biāo)記有符號(hào)的右移操作符與左移操作符剛好相反比如向右移動(dòng)位就是同樣的在移位的過程中也會(huì)出 位操作符的基本概念 因?yàn)镋CMAscript中所有數(shù)值都是以IEEE-75464格式存儲(chǔ),所以才會(huì)誕生了位操作符的概念. 位操作符作用于最基本的層次上,因?yàn)閿?shù)值按位存儲(chǔ),所以位操作符的作用也就是...
摘要:例如,十進(jìn)制數(shù),用二進(jìn)制表示則為。按位操作符操作數(shù)字的二進(jìn)制形式,但是返回值依然是標(biāo)準(zhǔn)的數(shù)值。不同為真相同為假二進(jìn)制按位異或運(yùn)算從左到右按位非為真,為假對(duì)每一項(xiàng)進(jìn)行非操作,遇真則假,遇假則真。 二進(jìn)制與十六進(jìn)制 二進(jìn)制用 0 1 表示 2= 10十六進(jìn)制 前綴0x 用0123456789ABCDEF表示 2= 0x2二進(jìn)制與十六進(jìn)制的轉(zhuǎn)換十六進(jìn)制的每位 等于二進(jìn)制的四位 十六進(jìn)制 0x...
閱讀 2344·2023-04-25 14:29
閱讀 1473·2021-11-22 09:34
閱讀 2714·2021-11-22 09:34
閱讀 3397·2021-11-11 10:59
閱讀 1863·2021-09-26 09:46
閱讀 2238·2021-09-22 16:03
閱讀 1928·2019-08-30 12:56
閱讀 484·2019-08-30 11:12