выборочный доступ к битам на типах данных с C ++ - PullRequest
0 голосов
/ 22 ноября 2010

Я использую C ++ для аппаратного проектирования моделей с помощью SystemC.SystemC как расширение C ++ представляет конкретные типы данных, полезные для описания сигналов и байтов.

Как я могу получить доступ к первым битам типа данных в целом, например:

sc_bv<16> R0;

или получить доступ к первым четырембиты tmp.

int my_array[42];
int tmp = my_array[1];

sc_bv - это тип данных битового вектора, в котором хранятся двоичные последовательности.Теперь я хочу первые четыре бита этого типа данных, например.Мой опыт работы с C # и Java, поэтому я пропускаю некоторые из основанных на OOP и Reflexion конструкций API в целом.Мне нужно выполнить конвертацию на этом низкоуровневом материале.Полезные вводные материалы очень помогли бы.

Спасибо :), wishi

Ответы [ 4 ]

2 голосов
/ 22 ноября 2010

Для sc_bv вы можете использовать оператор индексации []

Для int просто используйте обычные побитовые операции с константами, например, младший значащий бит в tmp равен tmp & 1

1 голос
/ 22 ноября 2010

Вам нужно будет немного больше узнать о sc_bv, чтобы убедиться, что вы получите правильную информацию. Кроме того, когда вы говорите «первые четыре байта», я предполагаю, что вы имеете в виду «первые четыре бита». Однако это также вводит в заблуждение, потому что вы действительно хотите провести различие между битами младшего или старшего разрядов.

В любом случае, вы используете побитовые операторы C для такого рода вещей. Однако вам нужно знать размер целочисленных значений И «порядковый номер» архитектуры времени выполнения, чтобы получить это право.

Но если вы ДЕЙСТВИТЕЛЬНО хотите только первые четыре бита, то вы бы сделали что-то вроде этого ...

inline unsigned char
first_4_bits(void const * ptr)
{
  return (*reinterpret_cast<unsigned char const *>(ptr) & 0xf0) >> 4;
}

и это схватит первые 4 бита того, на что он указывает. Таким образом, если первый байт, на который указывает указатель, равен 0x38, то эта функция вернет первые 4 бита, поэтому результат будет равен 3.

1 голос
/ 22 ноября 2010

Чтобы получить доступ к первым четырем (я предполагаю, что вы имеете в виду четыре старших бита) битам tmp (т.е. чтобы получить их значения), вы используете битовые маски.Поэтому, если вы хотите узнать, установлен ли, например, второй бит, выполните следующие действия:

int second_bit = (tmp & 0x4000000) >> 30;

сейчас second_bit равно 1, если бит установлен и равен нулю в противном случае,Идея заключается в следующем:

Представьте, что tmp (в двоичном виде)
1101 0000 0000 0000 0000 0000 0000 0000
Теперь вы используете побитовое И (&) со следующим значением
0100 0000 0000 0000 0000 0000 0000 0000 // which is 0x40000000 in hex
ANDing создает 1 для данного бита тогда и только тогда, когда оба операнда имеют соответствующие установленные биты (оба они 1).Таким образом, результат будет:
0100 0000 0000 0000 0000 0000 0000 0000
Затем вы сдвинете эти 30 бит вправо, что приведет к:
0000 0000 0000 0000 0000 0000 0000 0001 \\ which is 1
Обратите внимание, что если исходное значение имело проверенный нулевой битрезультат будет нулевым.

Таким образом, вы можете проверить любой бит, вам просто нужно предоставить правильную маску.Обратите внимание, что я предположил, что int имеет ширину 32 бита, что должно быть верно в большинстве случаев.

1 голос
/ 22 ноября 2010

Я не могу говорить за SystemC (звучит интересно, хотя). В обычном C вы бы прочитали младшие четыре бита с такой маской:

temp = R0 & 0xf;

и записать только в младшие четыре бита (при условии, что 32-битный регистр и температура <16) примерно так: </p>

R0 = (R0 & 0xfffffff0) | temp;
...