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

dat*_*ili 3 java algorithm

任务是连接2个给定数字的二进制.

例:

5(101)和3(011),结果是46(concat(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);
    }

}
Run Code Online (Sandbox Code Playgroud)

但问题是上面的代码给出的101110不是101011.

有什么问题?

pax*_*blo 6

你的问题是你正在倒退第二个数字的位.那是因为x%2是低位:

+---+---+---+       <110
| 1 | 0 | 1 | <-----------------+^
+---+---+---+                   |1
              +---+---+---+     |1
              | 0 | 1 | 1 | ----+0
              +---+---+---+ 011>
Run Code Online (Sandbox Code Playgroud)

畏缩在我真棒艺术能力:-)然而,如果你已经知道,它是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

就图形方式而言:

                  +---+---+---+
                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 |
                  +---+---+---+
Run Code Online (Sandbox Code Playgroud)

一次做一点没有明显的理由.