【问题标题】:Maximum number of consecutive 1 in a given number给定数字中连续 1 的最大数量
【发布时间】:2019-01-28 23:30:11
【问题描述】:
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,但如何?

【问题讨论】:

  • 首先,方法名称具有误导性。

标签: java binary decimal


【解决方案1】:

正如我们所知,&lt;&lt; 运算符将其操作数中的所有位向左移动 1。此外,&amp; 运算符对其两个操作数的所有位执行按位与。

x 什么时候不是0?当按位与运算找到在两个操作数中都设置的 2 位时。只有当xx &lt;&lt; 1 中有2 个或更多连续的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.

【讨论】:

    【解决方案2】:

    x = (x &amp; (x &lt;&lt; 1)) 被执行了足够的次数以消除最长的连续组1 位。每次循环迭代都会将1s 的每个连续组减少一个,因为该数字在逻辑上是ANDed,其自身左移一位。这种情况一直持续到没有连续的1s 组。

    为号码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 声明二进制文字很方便。

    【讨论】:

      【解决方案3】:

      :二进制左移运算符。左操作数的值向左移动右操作数指定的位数。

      x&lt;&lt;1 将值位从右向左移动 1,并在单位位置添加 0。所以,假设x=7,位表示将是111。执行x &lt;&lt; 1 将返回110,即丢弃头元素,将位向左移动并在最后添加0

      这个while循环可以分解为下面的迭代,初始值为x=7

      迭代1)111 &amp; 110 =110

      迭代2)110 &amp; 100 =100

      迭代 3) 100 &amp; 000 =000

      由于x的值为0,不再迭代

      希望这能解释这段代码的行为。你可以放System.out.println(Integer.toBinaryString(x));自己查看x的bit值变化

      【讨论】:

        【解决方案4】:

        所以发生的情况是,对于 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
        

        这就是你得到 3 换 7 的方式

        【讨论】:

          猜你喜欢
          • 2019-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-01
          • 1970-01-01
          相关资源
          最近更新 更多