簡體   English   中英

給定數字中最大連續1個數字

[英]Maximum number of consecutive 1 in a given number

public int tobinary(int x)
{
    int count = 0;
    while(x!=0)
    {
        x=(x&(x<<1));         //how this stuff is working
        count++;
    }
    return count;
}

上面的代碼工作正常,但實際上我確實進行了復制和粘貼。所以我只想知道我上面提到的那行代碼是如何工作的,這對我有很大的幫助。

例如,我給i / p作為7的二進制格式是0111,所以我們的答案將是3,但是如何?

眾所周知, <<運算符將其操作數中的所有位向左移動,這里是1。此外, &運算符對兩個操作數的所有位都按位進行“與”運算。

x什么時候不為0 當按位與運算找到兩個在兩個操作數中都設置的位時。 只有在x有2個或更多連續1位且x << 1時,這才是正確的。

x     : 0000 0111
x << 1: 0000 1110
-----------------
     &: 0000 0110
count = 1

如果它不為0 ,那么該數字中至少有2個連續的1位,並且該數字中連續1位的(最大)個數已減少了1。因為我們首先進入了循環,所以對它進行計數並再試一次。 最終將不再有連續的1位,因此我們以正確的計數退出循環。

x     : 0000 0110
x << 1: 0000 1100
-----------------
     &: 0000 0100
count = 2

x     : 0000 0100
x << 1: 0000 1000
-----------------
     &: 0000 0000
count = 3, exit loop and return.

x = (x & (x << 1))次數足以消除最長的連續1位組。 每次循環迭代減少了在每個連續組1通過一個,因為數字邏輯上小號AND與自身編移位一個位左。 這一直持續到沒有連續的1 s組為止。

為了說明它的編號110111101

 110111101 // initial x, longest sequence 4
1101111010 // x << 1, count 1
 100111000 // new x, longest sequence 3
1001110000 // x << 1, count 2
    110000 // new x, longest sequence 2
   1100000 // x << 1, count 3
    100000 // new x, longest sequence 1
   1000000 // x << 1, count 4
         0 // new x, end of loop

請注意,由於Java 7,使用int input = 0b110111101聲明二進制文字很方便。

<<(左移) :二進制左移運算符。 左操作數的值向左移動右操作數指定的位數。

x<<1將值位從右向左移動1,然后在單位位置加0 因此,假設對於x=7 ,位表示將是111 執行x << 1將返回110即丟棄頭元素,將這些位左移並最后加0

對於x=7初始值,可以將此while循環分解為以下迭代

迭代1) 111 & 110 =110

迭代2) 110 & 100 =100

迭代3) 100 & 000 =000

由於x值為0,因此不再進行迭代

希望這可以解釋此代碼的行為。 您可以將System.out.println(Integer.toBinaryString(x)); 自己看x位值變化

因此,對於while循環中的每個迭代,發生的事情是x = x(AND運算符)(2 * x)。

例如,當x = 7計數= 0時

Iteration 1:

//x = 7 & 14 which results in 6 ie

0111
1110 (AND)
-------
0110 => 6
-------
count = 1

Iteration 2:

//x = 6 & 12 results in 4

0110
1100 AND
-------
0100 => 4
-------
count = 2

Iteration 3:
// x = 4 & 8 results in 0

0100
1000 AND
-----
0000 
-----
count = 3

就是這樣7得3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM