二級制找1

運算符

  • &:0&0=0 ,1&0=1,0&1=1,1&1=1
  • |:0|0=0,0|1=1,1|0=1,1|1=1
  • ^ :00=0,10=1,01=1,11=0

左移運算符
m"<<"n,左移n位,左邊的n位被丟棄,同時最右邊補上n個0
比如

00001010<<2==00101000
10001010<<3==01010000

右移運算符m>>n表示右移n位。右移n位的時候,最右側(cè)n位被丟棄。單右移時處理最左邊位的情形要復(fù)雜一點,如果數(shù)字是一個無符號數(shù)值,則用0填補最左邊的n位。如果數(shù)字是一個有符號數(shù)值,則右移之后再最左邊補上n個0,如果數(shù)字原先是負(fù)數(shù),則右移之后再最左邊補上n個1.

00001010>>2=00000010
10001010>>3=11110001

請實現(xiàn)一個函數(shù),輸入一個整數(shù),輸出該數(shù)的二進制中表示1的個數(shù)。例如把9表示成二進制數(shù)是10001,有2位是1,。因此如果輸入9,該函數(shù)輸出2
可能引起死循環(huán)的解法
--
先判斷整數(shù)二進制表示中最右邊數(shù)是不是1,接著把輸入的整數(shù)右移以為,此時原來處于右邊數(shù)的第二位被移到最右邊,再判斷是不是1.這樣每次移到一位,直到整個整數(shù)變?yōu)?為止。判斷是不是1 則用&符號

    //尋找一個數(shù)字中的二級制中的1有幾個 可能有死循環(huán)的解法
    public int tester(int n) {
        int count = 0;
        while (n != 0) {
            if ((n & 1) == 1) {
                count++;
            }
            n = n >> 1;
        }
        return count;
    }

幾個面試問題:如果把整數(shù)右移一位和整數(shù)除以2在數(shù)學(xué)上是等級的,那上面的代碼可以把右移運算換成除以2么? 答案是否定的。因為觸發(fā)的效率比移位運算要低得多,在實際編程中盡可能使用移位運算符替代乘除法
如果函數(shù)中輸入一個負(fù)數(shù)如:0x80000000,則會出現(xiàn)的情況,把負(fù)數(shù)右移以為的時候,并不簡單的把高位1移到第二位變成0x4000000,而是0xC0000000。這是因為移位前是個負(fù)數(shù),仍然要保證移位后是個負(fù)數(shù)因此移位后的最高位會設(shè)為1。如果一直做右移運算,最終會變成0xfffffffff而陷入死循環(huán)

常規(guī)解法

可以不右移輸入的數(shù)字。首先把n和1做&運算,判斷最低位是不是1,然后左移

  //常規(guī)解法
    public static int tester2(int n) {
        int count = 0;
        int flag = 1;
        while (n != 0) {
            if ((n & flag) == 1) {
                count++;
            }
            n = n >> 1;
        }
        return count;
    }

另類解法

在分析算法前,先分析把一個數(shù)減去1,的情況,如果一個整數(shù)不為0,那么該整數(shù)的二進制表示中至少有一位是1。先假設(shè)這個數(shù)的最右邊一位是1,那么減去1時,最后一位變成0,而其他所有位都保持不變,也就是最后一位相當(dāng)于取反操作,由1變成0,接下來假設(shè)最后一位不是1而是0的情況,如果該整數(shù)的二進制表示中最右邊1位于第m位,那么減去1,第m位由1變成0,而第m位之后的所以0都變成1,整數(shù)中第m位之前的所以位保持不變。舉個例子:一個二級制數(shù)1100,它的第二位是從最右邊數(shù)起的一個1,減去1后,第二位變成0,它后面的兩位變成1,而前面的1保持不變,因此是1011.
在前面兩種情況下,我們發(fā)現(xiàn)把一個整數(shù)減去1,都是把最右邊的1變成0,如果它的右邊還有0的話,所以0變成1,而它左邊所以位都保持不變,接下來我們把一個整數(shù)和它減去1的結(jié)果做位與運算,相當(dāng)與它最右邊的1變成0,還是以前面的1100為例,它減去1的結(jié)果是1011,我們把1011與1100做與運算,得到的結(jié)果是1000,我們把1100最右邊的1變成0,剛好是1000
分析總結(jié)
--
把一個整數(shù)減去1,在和原整數(shù)做與運算,會吧該整數(shù)最右邊的一個1變?yōu)?,那么一個整數(shù)的二進制表示中有多少個1,就可以做多少次這樣的操作。

public static int count(int n){
         int num = 0;
         while(n!=0){
             n = n&(n-1);
             num++;
         }
         return num;
     }

左移的循環(huán)次數(shù)等于整數(shù)二進制的位數(shù),32位的整數(shù)需要32次,而上述的次數(shù),取決于整數(shù)中有幾個1,就循環(huán)幾次

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,234評論 2 375

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

  • 本章將會介紹 模塊和源文件訪問級別訪問控制語法自定義類型子類常量、變量、屬性、下標(biāo)構(gòu)造器協(xié)議擴展泛型類型別名位運算...
    寒橋閱讀 900評論 0 2
  • 高級運算符(Advanced Operators) 本文參考自蘋果官方文檔Advanced Operators本頁...
    果啤閱讀 1,608評論 1 5
  • 高級運算符 文檔地址 作為 基本運算符 的補充,Swift 提供了幾個高級運算符執(zhí)行對數(shù)傳值進行更加復(fù)雜的操作。這...
    hrscy閱讀 855評論 0 2
  • 我真是無語了,從昨晚碼到現(xiàn)在的福利,居然發(fā)不出去,秒屏蔽,說我文有問題就算了,我7點多發(fā)個微信小劇場居然也被秒屏蔽...
    陸菱歌閱讀 8,181評論 0 9
  • 你說網(wǎng)名不換,簽名不換,頭像不換,因為找不到更好的。 我兩年后可不可以成為你認(rèn)為的最好呢。 我好難過,可我還會努力...
    影繁閱讀 180評論 0 0