代码连接两个数字的位不起作用

时间:2010-06-29 05:59:16

标签: java algorithm

任务是连接2个给定数字的二进制文件。

示例:

鉴于5101)和3011),结果为46concat(101, 011) = 101011

到目前为止的代码:

public class Concat {
    public static void main(String[] args) {
      int t = 0;
      int k = 5;
      int x = 3;
      int i = 0;
       while (i < 3) {
           t = x % 2;
            x /= 2;
            k <<= 1;
            k |= t;
           ++i;
       }

      System.out.println(k);
    }

}

但问题是上面的代码提供了101110,而不是101011

有什么问题?

3 个答案:

答案 0 :(得分:5)

您的问题是您正在向后中提供第二个数字的位。那是因为x%2是低位:

+---+---+---+       <110
| 1 | 0 | 1 | <-----------------+^
+---+---+---+                   |1
              +---+---+---+     |1
              | 0 | 1 | 1 | ----+0
              +---+---+---+ 011>

Cringe 以我非常棒的艺术能力:-)然而,如果你已经知道它是3位宽,那就使用:

public class concat {
    public static void main (String[] args) {
        int t = 0;
        int k = 5;
        int x = 3;

        k <<= 3;
        k |= x;
        // or, in one line: k = (k << 3) | x;

        System.out.println(k);
    }
}

就图形的外观而言:

                  +---+---+---+
                k:| 1 | 0 | 1 |
                  +---+---+---+
                  +---+---+---+
                x:| 0 | 1 | 1 |
                  +---+---+---+

      +---+---+---+---+---+---+
k<<=3:| 1 | 0 | 1 | 0 | 0 | 0 |
      +---+---+---+---+---+---+
                  +---+---+---+
                x:| 0 | 1 | 1 |
                  +---+---+---+

      +---+---+---+---+---+---+
 k|=3:| 1 | 0 | 1 | 0 | 1 | 1 |
      +---+---+---+---+---+---+
                    ^   ^   ^
                  +---+---+---+
                x:| 0 | 1 | 1 |
                  +---+---+---+

没有明显的理由一次做一次。

答案 1 :(得分:2)

您只需shift一个号码,然后or使用另一个号码:

int a = 5;
int b = 3;
int c = (a << 3) | b;

答案 2 :(得分:0)

我不知道你使用的语言是什么,它几乎是Java,所以我要继续使用它。

这会返回您要求的结果,但您没有给出确定3应该是011而不是11的规则。

我假设您要假设两个数字具有相同的位数,因此3为011,因为5需要3位。

public class Concat {
  public static void main(String[] args) {
    System.out.println( joinNums(3,5) );
  }

  public static int numBits( int n ) { 
    return (int)Math.ceil( Math.log(n) / Math.log(2) );
  }

  public static int joinNums( int num1 , int num2 ) {
    int bits = Math.max( numBits(num1) , numBits(num2) );
    return (num1 << bits) + num2;
  }
}