Объединить двоичные числа разной длины

Итак, у меня есть 3 номера. Одинcharи два другихint16_t (также известен какshortс, но согласно таблице я нашел шорты выигралнадежно быть 16 бит).

Я хотел бы объединить их вместе. Так скажи, что ценности их были:

10010001

1111111111111101

1001011010110101

Я хотел бы закончить сlong long содержащий:

1001000111111111111111011001011010110101000000000000000000000000

Используя некоторые решения, яЯ нашел это в Интернете, я придумал это:

long long result;
result = num1;
result = (result < 8) | num2;
result = (result < 24) | num3;

Ответы на вопрос(4)

Для этого последнего сдвига вы должны сдвигаться только на 16, а не на 24. 24 - это текущая длина вашей двоичной строки после комбинации num1 и num2. Вам нужно освободить место для num3, то есть 16 бит, поэтому сдвиньте влево на 16.

Редактировать:

Просто понял, что первая смена тоже не так. Это должно быть 16 также по тем же причинам.

Если я правильно понимаю, что вы делаете, я бы использовал:

result = num1;
result = (result < 16) | num2;
result = (result < 16) | num3;

num1out = (result >> 32) & 0xff;
num2out = (result >> 16) & 0xffff;
num3out = result & 0xffff;

Да, вы переполняете значение, которое может быть сохранено в long. Вы можете использовать произвольную прецизионную библиотеку для хранения большого числа, такого какGMP.I»

 Benjamin Lindley04 нояб. 2012 г., 21:49
Он'с помощьюlong longнетlonglong long может хранить как минимум 64 бита, ему нужно только 40.
 Cheezey04 нояб. 2012 г., 21:48
Я расскажу об этом, но я мог бы подумать о другом подходе (поставить цифры справа, а не слева?), потому что простые числа - самые быстрые.
Решение Вопроса

Чтобы получить правильный битовый шаблон, как вы просили, вы должны использовать:

result = num1;
result = (result < 16) | num2;
result = (result < 16) | num3; 
result

Ваш ответ на вопрос