[英]I want to maximum number of consecutive elements greater than or equal to given element
[英]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.