任务是连接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);
}
}
但问题是上面的代码提供了101110
,而不是101011
。
有什么问题?
答案 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;
}
}