Если у меня есть указатель на начало области памяти, и мне нужно прочитать значение, упакованное в биты 30, 31 и 32 этой области, как я могу прочитать это значение?Чтение бит в памяти
7
A
ответ
8
Использование bit masks.
3
Это зависит от того, насколько большой байт в вашей машине. Ответ будет зависеть от того, если вы ноль или один индекс для этих чисел. Следующая функция возвращает 0, если бит равен 0 и не равно нулю, если это 1.
int getBit(char *buffer, int which)
{
int byte = which/CHAR_BIT;
int bit = which % CHAR_BIT;
return buffer[byte] & (1 << bit);
}
Если ваш компилятор не может оптимизировать достаточно хорошо, чтобы включить разделение и ультрасовременные операции в битовые операции, вы можете сделать это явно, но я предпочитаю этот код для ясности.
(ред исправить ошибку и изменить к CHAR_BIT, что это отличная идея.)
0
В 32-разрядной системе вы можете просто сдвинуть указатель справа 29. Если вам нужны значения бит на месте и 0xE0000000.
1
я бы, вероятно, generalize this answer к чему-то вроде этого:
template <typename T>
bool get_bit(const T& pX, size_t pBit)
{
if (pBit > sizeof(pX) * CHAR_BIT)
throw std::invalid_argument("bit does not exist");
size_t byteOffset = pBit/CHAR_BIT;
size_t bitOffset = pBit % CHAR_BIT;
char byte = (&reinterpret_cast<const char&>(pX))[byteOffset];
unsigned mask = 1U << bitOffset;
return (byte & mask) == 1;
}
бит проще в использовании:
int i = 12345;
bool abit = get_bit(i, 4);
Смежные вопросы
- 1. Чтение бит из памяти
- 2. Чтение/запись бит длинного
- 3. Чтение бит серийно в C
- 4. Чтение памяти в SharedArrayBuffer
- 5. Android - бит кэш-памяти занимает много памяти
- 6. Чтение и запись 64 бит по 64 бит в C
- 7. Чтение uint16_t из потока бит
- 8. Чтение бит из массива char
- 9. Чтение бит внутри 2 байт
- 10. Чтение символов на уровне бит
- 11. Чтение 22 бит через SPI
- 12. Чтение 12 бит ввода C++
- 13. Чтение отдельных битов из памяти
- 14. MongoDB недостаточно памяти, 32 бит
- 15. Чтение наименее значимых бит в Python
- 16. Чтение значения реестра DWORD в 64 бит
- 17. чтение и запись бит в файл C++
- 18. Чтение .bmp (24 бит) в 2D-массив
- 19. Чтение памяти с учетом 24-битного адреса
- 20. Конкатенация бит оперативной памяти в Verilog
- 21. Ассамблеи предел бит памяти в арифметике
- 22. Как перевернуть любой бит в блоке памяти?
- 23. Чтение блока памяти в массив?
- 24. Чтение массива в памяти Адрес
- 25. Чтение содержимого ElastiCache в памяти
- 26. Чтение файлов: ошибка в памяти
- 27. Чтение памяти процесса в C++
- 28. Чтение смарт-карты (8 бит или 16 бит?)
- 29. Чтение потока памяти
- 30. Чтение/запись защищенной памяти?
Используйте 'CHAR_BIT' вместо 8. – GManNickG
В случае, если это не будет:' Возвращение буфера [byte] & (1 << бит); '? Похоже, вы разрешаете слишком много бит, если (например) бит == 3. –
@platinum yup. Ввод слишком быстро. Фиксация сейчас. –