Member 12831240 Ответов: 1

Извлеките определенные биты и скопируйте их в какое-нибудь другое место в памяти на языке Си


Я хочу скопировать " n "битов из битовой позиции" m " в памяти. У меня есть указатель на определенный блок в 32-битной выровненной памяти. Позиция " m " - это m битов от этого указателя. Я хочу, чтобы скопировать n бит из этого 'М' бит установки в новый бит 'П', который является 'Р' бит с указателем. Это также может совпадать с буквой "М". Нужно справиться и с этим сценарием.

Например,

<----32 бит - - - - - >
ptr - >|_________________|
|_______|м|_______|
|_________________|
|_________________|
|__|п|____________|
|_________________|

Я хочу извлечь 67 бит из 45-й битной позиции(m) и скопировать все эти данные в 132-ю битную позицию(p).

Что я уже пробовал:

Я понятия не имею, как действовать дальше

Richard MacCutchan

Вам нужно сделать это, выбрав байт за раз, который нужно будет сдвинуть влево или вправо по мере необходимости. Если вы нарисуете кусочки на бумаге и отметите те, которые нужно скопировать, должно быть довольно ясно, что нужно сделать.

1 Ответов

Рейтинг:
2

KarstenK

Доступ к отдельным битам информации - одна из самых старых задач любого программного обеспечения, поэтому это базовые знания для опытного программиста. Потратьте несколько часов и несколько чашек кофе, чтобы понять это, потому что понимание этого вопроса очень ценно и поможет вам в каждой задаче, связанной с данными или памятью.

В языке Си это самый маленький блок памяти в байт, часто описываемый с типом данных unsigned char. Он имеет 8 бит (0 или 1) значений, поэтому он может хранить 2^8 = 256 значений.

Для доступа к биту в памяти имеет смысл определить байтовый указатель на его начало и, чем работать со смещением, получить доступ к байту. В этом байте вы получаете доступ к битам с помощью побитовых операторов, как это описано в эта прекрасная статья.

Хорошая, но продвинутая вещь в C-это битовые поля. Это типы, которые объявляют отдельные биты как переменные. Взгляните на это статья.