二進(jìn)制轉(zhuǎn)換及javascript的位操作符

位操作符

  • 因為位操作符在數(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吟宦,隨后出現(xiàn)的幾起案子惹想,更是在濱河造成了極大的恐慌,老刑警劉巖督函,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘀粱,死亡現(xiàn)場離奇詭異,居然都是意外死亡辰狡,警方通過查閱死者的電腦和手機锋叨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宛篇,“玉大人娃磺,你說我怎么就攤上這事〗斜叮” “怎么了偷卧?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵豺瘤,是天一觀的道長。 經(jīng)常有香客問我听诸,道長坐求,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任晌梨,我火速辦了婚禮桥嗤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仔蝌。我一直安慰自己泛领,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布敛惊。 她就那樣靜靜地躺著渊鞋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞧挤。 梳的紋絲不亂的頭發(fā)上锡宋,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音皿伺,去河邊找鬼员辩。 笑死,一個胖子當(dāng)著我的面吹牛鸵鸥,可吹牛的內(nèi)容都是我干的奠滑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼妒穴,長吁一口氣:“原來是場噩夢啊……” “哼宋税!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讼油,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杰赛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矮台,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乏屯,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年瘦赫,在試婚紗的時候發(fā)現(xiàn)自己被綠了辰晕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡确虱,死狀恐怖含友,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤窘问,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布辆童,位于F島的核電站,受9級特大地震影響惠赫,放射性物質(zhì)發(fā)生泄漏把鉴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一汉形、第九天 我趴在偏房一處隱蔽的房頂上張望纸镊。 院中可真熱鬧倍阐,春花似錦概疆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至概耻,卻和暖如春使套,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鞠柄。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工侦高, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厌杜。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓奉呛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夯尽。 傳聞我的和親對象是個殘疾皇子瞧壮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容