Работа с битовыми полями.

NAgain
Offline
Зарегистрирован: 28.01.2016

Всем привет.

В памяти содержится массив некий массив данных. В нем хранятся значения абстрактного параметра от 0 до 15. Таким образом, в 1 байт можно смело засунуть 2 значения - первой в 4 старших бита, второе - в 4 младших. Тут вопросов нет.

Проблема в том, как их оттуда получить ? С побитовыми операциями знаком, но тут то нуобходимо использовать сразу 4 бита. Была смысль применить под это дело приблизительно такую структуру:

 

struct st {
	unsigned one:	4;
	unsigned two:	4;
} data;

но что-то не соображу, как ее заполнить используя pgm_read_byte(***); ?

Что-то хожу вокруг да около и не могу придумать решения. Может и не нужны тут никакие поля ? Может можно как-то проще разбить байт на 2 части и получить оттуда обычные hex-значения обеих частей по отдельности ?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
JasKo
Offline
Зарегистрирован: 21.11.2015

Посмотри тут

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот ведь удивительное дело, что процессору на ваши битовые поля начхать. У него  есть система команд. И он так работает. Битовые поля это проблема языка Си и программиста как внятно объяснить компилятору и в конце концов процессору что делать. Если идти дальше то от программиста требуется внятно описать что и как надо делать. 

struct st {
  char one: 4;
  char two: 4;
} data;

пс https://msdn.microsoft.com/ru-ru/library/yszfawxh.aspx

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

NAgain пишет:

но что-то не соображу, как ее заполнить используя pgm_read_byte(***); ?

А чего тут соображать? Если в pgm значения хранятся целыми байтами, то

data.one = pgm_read_byte(***);
data.two = pgm_read_byte(***);

Если они там как-то по-другому хранятся, так потрудитесь описать как, а то хрустальные шары Клапауций недавно запретил.

arduinec
Offline
Зарегистрирован: 01.09.2015
byte data = pgm_read_byte(***);
byte one = (data & 0xF0) >> 4;
byte two = data & 0x0F;

 

NAgain
Offline
Зарегистрирован: 28.01.2016

arduinec Ага, сам к этому же и пришел.

Всем спасибо за ответы.