位操作符
- 因為位操作符在數(shù)值都表示的最底層的操作擂红,因此性能上比其他操作符要好,只做了解土砂,性能好乏悄,但是會導(dǎo)致代碼可讀性降低
- 二進(jìn)制
- 二進(jìn)制是計算技術(shù)中廣泛采用的一種數(shù)制。二進(jìn)制數(shù)據(jù)是用0和1兩個數(shù)碼來表示的數(shù)陕凹。它的基數(shù)為2悍抑,進(jìn)位規(guī)則是“逢二進(jìn)一”,借位規(guī)則是“借一當(dāng)二”杜耙,由18世紀(jì)德國數(shù)理哲學(xué)大師萊布尼茲發(fā)現(xiàn)搜骡。當(dāng)前的計算機系統(tǒng)使用的基本上是二進(jìn)制系統(tǒng),數(shù)據(jù)在計算機中主要是以補碼的形式存儲的佑女。計算機中的二進(jìn)制則是一個非常微小的開關(guān)记靡,用“開”來表示1,“關(guān)”來表示0团驱。數(shù)字計算機只能識別0和1摸吠。簡單,易于電子方式的實現(xiàn)嚎花。
- 十進(jìn)制轉(zhuǎn)二進(jìn)制
- 用十進(jìn)制數(shù)字除以2寸痢,取余數(shù),用得到的結(jié)果繼續(xù)除以2紊选,一直到1除以2啼止,然后求倒序就是二進(jìn)制了
- 例如:10,10/2 = 5 余 0 丛楚;5/2 = 2余1族壳;2/2 = 0憔辫;這時候除盡了趣些,則進(jìn)行最后一次計算,1/2除不開贰您,直接等于1即可坏平;最后組合余數(shù)為:0101,然后倒序就是1010锦亦,因此10轉(zhuǎn)為二進(jìn)制就是1010了
- 因此舶替,9的二進(jìn)制就是9/2=4余1,4/2=2余0杠园,2/2=0余0顾瞪,1/2余1,得1001,倒序9的2進(jìn)制就是1001
- 39的二進(jìn)制就是:39/2=19余1,19/2=9余1陈醒,9/2=4余1惕橙,4/2=2余0,2/2=0余0钉跷,1/2余1弥鹦,組合余數(shù):111001,倒序,39的二進(jìn)制就是100111
- 高位補0
- 在內(nèi)存中某一個類型的值是有固定長度的爷辙,比如int類型的是32位的彬坏,10轉(zhuǎn)為二進(jìn)制位1010,那么就會在1010前面補28個0膝晾,補為32位進(jìn)行存儲
- 一般正數(shù)高位補0栓始,負(fù)數(shù)高位補1
- 二進(jìn)制轉(zhuǎn)十進(jìn)制
- 按權(quán)相加法
- 10的二進(jìn)制是1010,從右往左按下標(biāo)來數(shù)血当,0的下標(biāo)是0混滔,1為1,0為2歹颓,1為3坯屿,把這些二進(jìn)制中數(shù)字是1的下標(biāo)當(dāng)做2的冪進(jìn)行相加,那么1010 = 0 + 2^1 + 0 + 2^3 = 0 + 2 + 0 + 8 = 10
- 9的二進(jìn)制是1001巍扛,相應(yīng)的1001 = 2^0 + 0 + 0 + 2^3 = 1 + 0 + 0 + 8 = 9
- 39的二進(jìn)制是100111领跛,相應(yīng)的100111 = 2^0 + 2^1 + 2^2 + 0 + 0 + 2^5 = 1 + 2 + 4 + 0 + 0 + 32 = 39
- 符號位
- 正負(fù)號標(biāo)記
- 負(fù)十進(jìn)制轉(zhuǎn)二進(jìn)制
- 以-10為例,先將整數(shù)部分進(jìn)行二進(jìn)制計算撤奸,余數(shù)為0101吠昭,倒序10的二進(jìn)制為1010,高位補0補到8位得00001010胧瓜,取反得到11110101然后加1矢棚,由于二進(jìn)制中只有0和1,因此遇2要進(jìn)一位府喳,則-10轉(zhuǎn)為二進(jìn)制位-11110110蒲肋,負(fù)數(shù)高位補1
- 二進(jìn)制負(fù)數(shù)轉(zhuǎn)十進(jìn)制
- 以-10為例,負(fù)數(shù)二進(jìn)制位11110110钝满,先減1兜粘,0位不夠減,向前借一位弯蚜,0往前借一位孔轴,得2,2減1得1碎捺,因此得到11110101路鹰,然后取反得到-00001010贷洲,這就是10的二級制了
- 小數(shù)轉(zhuǎn)二進(jìn)制
- 小數(shù)點前面按照正負(fù)數(shù)轉(zhuǎn)換即可,把小數(shù)點前面的正數(shù)部分剝離開晋柱,補0恩脂,小數(shù)點后面的,每次乘以2趣斤,得到的結(jié)果取正數(shù)部分即可俩块,然后拼接一起
- 例如:10.2,10轉(zhuǎn)為二進(jìn)制為1010浓领,剝離整數(shù)部分補0為0.2玉凯,0.2乘以2,為0.4联贩,取整數(shù)部分0漫仆,0.4乘以2,得0.8泪幌,取整數(shù)部分0盲厌,0.8乘以2,得1.6祸泪,取整數(shù)部分1吗浩,現(xiàn)在整數(shù)部分有1了,記錄1没隘,然后剝離出去懂扼,這個1不用轉(zhuǎn)二進(jìn)制,即使轉(zhuǎn)也是1右蒲,然后留下0.6阀湿,繼續(xù)乘以2,得到1.2瑰妄,剝離陷嘴,得0.2,乘以2间坐,得0.4灾挨,取整數(shù)部分……一直到夠32位或者到達(dá)指定位數(shù)或者小數(shù)部分為0,最終結(jié)果為:1010.00110011001100110011
- 例如:10.5眶诈,10轉(zhuǎn)二進(jìn)制為1010涨醋,保留剝離瓜饥,剩余0.5逝撬,0.5乘以2得1.0,取整數(shù)部分乓土,小數(shù)部分為0宪潮,因此不需要繼續(xù)計算了溯警,所以10.5轉(zhuǎn)為二進(jìn)制結(jié)果為:1010.1
- 二進(jìn)制小數(shù)轉(zhuǎn)十進(jìn)制
- 先把整數(shù)部分和小數(shù)部分拆來,例如10.5的二進(jìn)制為1010.1狡相,拆為1010和0.1梯轻,然后整數(shù)部分按照二進(jìn)制轉(zhuǎn)十進(jìn)制正常轉(zhuǎn)換,小數(shù)部分0.1 =1 乘以 2 ^ -1 = 0.5,拼接后的10.5
- 例如:10.2轉(zhuǎn)為二進(jìn)制位1010.00110011001100110011尽棕,整數(shù)部分轉(zhuǎn)為10喳挑,小數(shù)部分為0.00110011001100110011就等于:0 * 2^ -1 + 0 * 2^-2 + 1 * 2^-3 + 1 * 2^ -4 + 0 * 2^-5…… (對應(yīng)小數(shù)位置的0或1) * 2 ^ -n(從左往右1 - n)
- 位操作是程序設(shè)計中對位模式按位或二進(jìn)制數(shù)的一元和二元操作
- 在js中對64位(0-9 + a-z + A-Z + - + ~)的數(shù)值會轉(zhuǎn)為32位數(shù)值,計算完成在轉(zhuǎn)為64位滔悉,NaN和Infinity會被當(dāng)做0來處理伊诵,這是由于轉(zhuǎn)換時存在的副效應(yīng),如果使用位操作符轉(zhuǎn)換非數(shù)字回官,則會先把其轉(zhuǎn)為Number類型曹宴,再進(jìn)行轉(zhuǎn)換
- 按位非
- 用~表示
- 10的二進(jìn)制位1010,補32位為00000000000000000000000000001010
- var num = ~10,表示非10的二進(jìn)制歉提,則對上面的32位二進(jìn)制數(shù)字進(jìn)行求反得:11111111111111111111111111110101
- 因此var num = ~10得 -11笛坦,本質(zhì)上是對操作數(shù)的負(fù)值-1,相等于var num2 = -num - 1;
- 按位與
- 用&表示
- 先將兩邊的操作數(shù)轉(zhuǎn)為二進(jìn)制苔巨,然后補齊32位版扩,每一位進(jìn)行比較,遇0返回0侄泽,都為1返回1
- 例:2 & 4资厉,2轉(zhuǎn)為二進(jìn)制為10,補齊00000000000000000000000000000010蔬顾,4轉(zhuǎn)為二進(jìn)制為100宴偿,補齊后為:00000000000000000000000000000100,每一位對應(yīng)比較诀豁,按照上面規(guī)則窄刘,沒有對應(yīng)的,全返會0舷胜,因此結(jié)果為00000000000000000000000000000000娩践,也就是0
- 例2 & 3,2轉(zhuǎn)二進(jìn)制為10烹骨,補齊00000000000000000000000000000010翻伺,3轉(zhuǎn)二進(jìn)制為11,補齊后得到結(jié)果為:00000000000000000000000000000011沮焕,參照以上規(guī)則吨岭,1對應(yīng)1返回1,有0返回0峦树,則得到結(jié)果為:00000000000000000000000000000010辣辫,轉(zhuǎn)為十進(jìn)制后旦事,結(jié)果就為2
- 按位或
- 用|表示
- 先將兩邊的操作數(shù)轉(zhuǎn)為二進(jìn)制,然后補齊32位急灭,每一位進(jìn)行比較姐浮,遇1返回1,都為0返回0
- 例:2 | 4葬馋,2轉(zhuǎn)為二進(jìn)制為10卖鲤,補齊00000000000000000000000000000010,4轉(zhuǎn)為二進(jìn)制為100畴嘶,補齊后為:00000000000000000000000000000100扫尖,每一位對應(yīng)比較,按照上面規(guī)則掠廓,遇1返回1换怖,因此結(jié)果為00000000000000000000000000000110,也就是十進(jìn)制的6
- 例2 | 3蟀瞧,2轉(zhuǎn)二進(jìn)制為10沉颂,補齊00000000000000000000000000000010,3轉(zhuǎn)二進(jìn)制為11悦污,補齊后得到結(jié)果為:00000000000000000000000000000011铸屉,參照以上規(guī)則,遇1返回1切端,都為0返回0彻坛,則得到結(jié)果為:00000000000000000000000000000011,轉(zhuǎn)為十進(jìn)制后踏枣,結(jié)果就為3
- 按位異或
- 用^表示
- 先將兩邊的操作數(shù)轉(zhuǎn)為二進(jìn)制昌屉,然后補齊32位,每一位進(jìn)行比較茵瀑,一個為1间驮,一個為0返回1,都為1返回0马昨,都為0返回0
- 例:2 ^ 4竞帽,2轉(zhuǎn)為二進(jìn)制為10,補齊00000000000000000000000000000010鸿捧,4轉(zhuǎn)為二進(jìn)制為100屹篓,補齊后為:00000000000000000000000000000100,每一位對應(yīng)比較匙奴,按照上面規(guī)則堆巧,因此結(jié)果為00000000000000000000000000000110,也就是十進(jìn)制的6
- 例2 ^ 3,2轉(zhuǎn)二進(jìn)制為10恳邀,補齊00000000000000000000000000000010懦冰,3轉(zhuǎn)二進(jìn)制為11灶轰,補齊后得到結(jié)果為:00000000000000000000000000000011谣沸,參照以上規(guī)則,則得到結(jié)果為:00000000000000000000000000000001笋颤,轉(zhuǎn)為十進(jìn)制后乳附,結(jié)果就為1
- 左移
- 由<<表示
- 就是將十進(jìn)制的數(shù)轉(zhuǎn)為二進(jìn)制,將整體向左移動多少位后產(chǎn)生的結(jié)果
- 例如:var result = 2 << 5; 2轉(zhuǎn)為二進(jìn)制為10伴澄,補位后為00000000000000000000000000000010赋除,向左移動5位,得00000000000000000000000001000000非凌,左移會把空位以0進(jìn)行填充举农,然后把此結(jié)果轉(zhuǎn)為十進(jìn)制得64;
- 有符號右移
- 由>>表示
- 例如:var result = 2 >> 5; 2轉(zhuǎn)為二進(jìn)制為10敞嗡,補位后為00000000000000000000000001000000颁糟,向左移動5位,得00000000000000000000000000000010喉悴,然后把此結(jié)果轉(zhuǎn)為十進(jìn)制得2棱貌;
- 無符號右移
- 由>>>表示
- 會對32位都進(jìn)行向右移動
- 例如: var result = 2 >> 5; 2轉(zhuǎn)為二進(jìn)制為10,補位后為00000000000000000000000001000000箕肃,向左移動5位婚脱,得00000000000000000000000000000010,然后把此結(jié)果轉(zhuǎn)為十進(jìn)制得2勺像;但是負(fù)數(shù)結(jié)果就不一樣了障贸,只做了解
- 位操作符應(yīng)用
- 例如:var str = 'abcd'; var result = ~str.indexOf('a'); // -1 ; var result = ~str.indexOf('e'); // 0