[С++] последовательность бит в число, быстро
Есть целое знаковое число (4 байта закодированное в последовательность бит следующим образом:а где пункт 3?
1) Первый бит каждого байта равен 0 если число не закончилось и 1 если это последний байт.
2) Второй бит первого байта обозначает знак.
что в остальных то битах?
как минимум нада знать какой там эндиан
а так - может там ваще всё выворот на выворот
big-endian, если число положительное то первые нули обрезаются, если отрицательное - то первые единицы. Собственно нужен не непосредственно код, а просто общие соображения. Например, нормально ли использовать memcpy для конвертации уже нормальной последовательности бит (в виде массива или вектора unsigned char) в число?
ненормально.
ненормально.Спасибо. А как правильно?
А как правильно?либо с учётом endian (и не забыв проверить битность системы) делать грязные хаки (типа *(int*&ar[0]) либо битовой арифметикой - ar[0] << 24 + ar[1] << 16 + ar[2] << 8 + ar[3]
>> и <<
int сколько там байт занимает? если нехватает то используй long int
long int result;
1 байт
result = a[1] && 1<<8-1 && 1<<7-1
if a[1] & 1<<8 > 0
2 байт
result <<= 7;
result | = (a[2] && 1<<8-1)
иф 2, иф 3
end if
в конце ставим знак
if a[1] & 1<<7 > 0
result = -result
end if
либо битовой арифметикой - ar[0] << 24 + ar[1] << 16 + ar[2] << 8 + ar[3]там не так просто изза того что число может кончиться
result = -resultТут должно быть result = result - 256*256*256*256, только это некрасиво выглядит.
Тут должно быть result = result - 256*256*256*256, только это некрасиво выглядит.result -= 1 << (8 * 4)
там не так просто изза того что число может кончитьсяВопрос был такой:
Например, нормально ли использовать memcpy для конвертации уже нормальной последовательности бит (в виде массива или вектора unsigned char) в число?
Всем спасибо. Если еще есть предложения по увеличению производительности они приветствуются. Пока не ясно, достаточно ли скорости предложенного способа.
1 << (8 * 4)Это 0
Это 0Ну просто 256*256*256*256 не помещается в 4 байта, про которые ты написал в условии задачи.
а 1 << (8*4 - 1) можно ещё без вычитания обойтись: result &= ~(1 << (8*4 - 1
а ещё под нашу музыку можно много чего делать
1LL << (8 * 4)
Тут должно быть result = result - 256*256*256*256, только это некрасиво выглядит.ну этого в условии не было
я тут просто схематически показал что нада знак изменить
как уж там правильно менять по твому алгоритму - тебе видней
а 1 << (8*4 - 1) можно ещё без вычитания обойтись: result &= ~(1 << (8*4 - 1от не люблю я енту операцию инвертирования ~
она не наглядная, нужно думать сколько же там старших байтов осталось, т.е. сколько единичек в результе получится
она не наглядная,Гы, в итоге
result = result | ( 1 << (32 - k - 1) ^ (-1) );
получилось. Вот это точно не наглядно.
она не наглядная, нужно думать сколько же там старших байтов осталось, т.е. сколько единичек в результе получитсякак раз таки для снятия конкретных битов она - самая наглядная.
Оставить комментарий
Devid
Есть целое знаковое число (4 байта закодированное в последовательность бит следующим образом:1) Первый бит каждого байта равен 0 если число не закончилось и 1 если это последний байт.
2) Второй бит первого байта обозначает знак.
Надо быстро получить из такой последовательности (например в виде вектора unsigned char) число int. Как это можно сделать?