Объединенное двоичное представление двух целых - PullRequest
0 голосов
/ 07 сентября 2018

Допустим, у нас есть две переменные типа int, A и B битовой длины N < 16 и M < 16 соответственно. Нам нужна новая переменная int C, чтобы младшие биты N содержали биты A, а следующие M биты содержали биты B. (Предполагая, что все переменные имеют длину 32 бита и порядок байтов).

В моем решении я слегка обманул, используя вместо этого двоичные строки:

int a = 65535;
int b = 65;
String cStr = Integer.toBinaryString(b) + Integer.toBinaryString(a);
int c = Integer.parseInt(cStr, 2);

Но как мне сделать это, используя побитовые операторы?

Примеры:

A=1, B=1 (N=1, M=1 resp.) then C = 11 A = 11000011010100, B = 101100 (N=14, M=6 resp.) then C = 10110011000011010100

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Я Java:

c = b << 16 | a;

Но если вы хотите сдвинуть на точное количество бит:

c = b << (32 - Integer.numberOfLeadingZeros(a)) | a;
0 голосов
/ 07 сентября 2018

попробуйте это и проверьте, если у вас есть то же значение. Я не уверен, как это будет в Java, но это работает для C ++ и C # int c = b << 16 | а; </p>

Сначала вы должны рассчитать, сколько сдвинуть б. так:

int a = 65535;
int count = 0;
int temp = a;
while(temp != 0)
{
  ++count;
  temp = temp >> 1;
}

int b = 65;
int c = b << count | a;
...