概述在計算機程序中所有的數(shù)都是以二進制形式存儲的。位運算就是直接對整數(shù)在二進制進行計算操作,。作為一名程序員掌握位運算的基本使用是很重要的,,而對于算法程序員來說,位運算的靈活使用能夠更靈活高效的解決很多問題,。 位運算都有哪些
運算符邏輯按為與(&)參加運算的兩個數(shù)按二進制進行與運算。 0&0=0 用途: 清零 任何數(shù)與0做與運算結(jié)果都為0,。 取指定位 比如要取一個數(shù)的低4位,,則只需使用該數(shù)與(0000 1111)做與運行,結(jié)果就是這個數(shù)的低4位的值,。 奇偶判斷 只要二進制的末尾為0則是偶數(shù),,為1則為奇數(shù)。因此可用 按位或(|)參加運算的兩個數(shù)按二進制進行或運算,。
用途: 將某位設(shè)置為1 如X=0101,,需要將第2位設(shè)置為1,,結(jié)果變?yōu)?111,,則只需和(0010)進行或運算,0101|0010=0111,。 按位異或(^)參加運算的兩個數(shù)按二進制進行異或運算,。 0^0=0 用途: 翻轉(zhuǎn)指定位 如要將X=0101 1010的低4位翻轉(zhuǎn)為0101,則只需和Y=0000 1111進行異或運行,,X^Y=0101 0101 ,。 交換兩數(shù)值 如X=0101,Y=0100,,需要將X和Y的值進行交換,。
按位取反(~)參加運算的1個數(shù)據(jù)各位值0變1,1變0. ~0101=1010 用途: 取反運算和用于快速獲得某個特定值,如獲取一個最低位為0其他位為1的數(shù),,則對1進行取反即可,,~1。 左移運算符(<<)參與運算的1個數(shù)據(jù)各位左移,,高位丟棄,,低位補0。
如果左移的數(shù)最高位不等于1,,則相當于乘2,。 右移運算符(>>)參與運算的1個數(shù)據(jù)各位右移,如果該數(shù)為正則高位補0,,反之補1,,低位丟棄。 0101 >> 1 = 0010 某數(shù)進行右移運算相當于除以2,。 無符號右移運算符(>>>)又稱邏輯右移,,不管正負,高位補0,。
如負數(shù) 11111111111111111111111111111011>>>1=01111111111111111111111111111101 注:負數(shù)的二進制表示形式為補碼,。 有哪些騷操作技巧一
應(yīng)用:檢測整數(shù)x是否是2的次冪 思路:2的次冪滿足以下條件:
則x & (x - 1)的結(jié)果如果等于0則表示x是2的次冪,。 技巧二
一個數(shù)據(jù)集合中,只有1個數(shù)字出現(xiàn)1次,,其他數(shù)字都出現(xiàn)兩次,,找出這個數(shù)。 思路:只需要將所有數(shù)據(jù)進行異或運算,,結(jié)果就是這個數(shù),。 一個數(shù)據(jù)集合中,,只有2個數(shù)字出現(xiàn)過1次,其他數(shù)字都出現(xiàn)過兩次,,找出這兩個數(shù),。 思路:假設(shè)這兩個數(shù)是X,Y,所有數(shù)字進行異或的結(jié)果就是X^Y,因為異或運算邏輯是相同為0,,不同為1,,則找出這個結(jié)果的二進制中等于1的位置,然后將所有數(shù)字按照該位是否為1分成兩部分,,那么X和Y會被分開,,然后分別做異或運算,結(jié)果便是X和Y. 小結(jié)位運算在各大互聯(lián)網(wǎng)公司的面經(jīng)中經(jīng)常會出現(xiàn),,各種算法題中也高頻使用,,希望本文能讓你對位運算有一個初步的認識。 來都來了,,點個贊再走啦~ |
|