У меня есть множество небольших фрагментов данных, которые я хочу, чтобы иметь возможность засунуть в один более крупный тип данных. Скажем так, гипотетически, это дата и время. Очевидный метод - через поле бит, подобное этому.
struct dt
{
unsigned long minute :6;
unsigned long hour :5;
unsigned long day :5;
unsigned long month :4;
unsigned long year :12;
}stamp;
Теперь предположим, что эта вещь упорядочена так, что вещи, объявленные сначала, имеют бит более высокого значения, чем объявленные позже, поэтому, если я представляю биты первой буквой переменной, она будет выглядеть так:
mmmmmm|hhhhh|ddddd|mmmm|yyyyyyyyyyyy
Наконец, предположим, что я просто объявляю unsigned long и разделяю его, используя маски и сдвиги, чтобы делать то же самое.
unsigned long dateTime;
Вот мой вопрос:
Являются ли следующие способы получения минут, часов и т.д. Эквивалентными с точки зрения того, что компьютер должен делать? Или есть какой-то сложный метод, который компилятор/компьютер использует с битовыми полями.
unsigned minutes = stamp.minutes;
//versus
unsigned minutes = ((dateTime & 0xf8000000)>>26;
и
unsigned hours = stamp.hours;
//versus
unsigned hours = ((dateTime & 0x07C00000)>>21;
и др.