Код для объединения битов двух чисел не работает - PullRequest
2 голосов
/ 29 июня 2010

Задача состоит в том, чтобы объединить двоичные числа из 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.

В чем проблема?

Ответы [ 3 ]

5 голосов
/ 29 июня 2010

Ваша проблема в том, что вы вводите биты второго числа в в обратном направлении . Это потому, что 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 голосов
/ 29 июня 2010

Вы просто shift один номер, а затем or с другим номером:

int a = 5;
int b = 3;
int c = (a << 3) | b;
0 голосов
/ 29 июня 2010

Я не знаю, какой язык вы используете, это почти 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...