任务是连接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.
有什么问题?
你的问题是你正在倒退第二个数字的位.那是因为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)
一次做一点没有明显的理由.
| 归档时间: |
|
| 查看次数: |
3684 次 |
| 最近记录: |