2010-06-29 20 views
2

任务是连接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

有什么问题?

+4

你的问题没有太大意义,请编辑 – 2010-06-29 06:05:03

回答

5

你的问题是你硬塞给第二个数字的位向后。这是因为x%2是低位:

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

我真棒艺术能力:-)但是畏缩,如果你已经知道,它是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 | 
        +---+---+---+ 

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

2

你刚才shift一个号码,然后与对方号码or

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

不是不正确的,你确定它是正确的吗? – 2010-06-29 06:08:12

+0

对不起一分钟 – 2010-06-29 06:09:23

+1

是的正确我犯了一个错误 – 2010-06-29 06:10:44

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; 
    } 
} 
+0

哈哈,“差不多java” – 2014-03-26 23:09:05

相关问题