Как получить начальный номер бита при использовании битовых полей (C )

#c

Вопрос:

Предположим, что у нас есть структура, подобная этой

 struct my_struct
{
    uint16_t a : 2;
    uint16_t b : 6;
    uint16_t c : 8;
}my_struct

my_struct temp;
 

Есть ли в любом случае, чтобы получить начальную/конечную часть temp.b ? другими словами, существует ли синтаксис/встроенная функция в C , которая выполняет следующее:

 first_function(temp.b) // returns 2, since b starts on the second bit of the struct in the computers memory
second_function(temp.b) // Returns 8, since the last bit of b is the 8th bit of the struct in the computers memory
 

Надеюсь, мой вопрос ясен

Комментарии:

1. Зачем вам это нужно? Какова реальная проблема, которую вам нужно решить, и почему вы думаете, что знание «битов» решит эту проблему?

2. Этот вопрос ясен и не нуждается в закрытии. Ответ, конечно, отрицательный , но это не делает вопрос неясным.

3. Вы могли бы сделать memset(amp;temp, 0xFF, sizeof temp); , а затем temp.b = 0; , а затем посмотреть на биты, чтобы найти 0 битов. Это может быть полезным началом для написания ваших собственных подпрограмм first_function и second_function.

4. Кстати, его реализация определяет, как упакованы биты в целое число (или нет) и в каком порядке они присутствуют в целом числе. Это означает b , что в одном компиляторе могут быть биты 2 7 , в то время как в другом это могут быть биты 10 15 .

5. @Eljay только что взломал решение, которое использует вашу основную идею, и оно работает: godbolt.org/z/1W1ro3h3o (Он использует __builtin_popcount выражения и для удобства, но вы поняли идею). second_function Эквивалент, вероятно, включал бы повторение байтов в обратном порядке. Отличная идея!

Ответ №1:

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

Ответ №2:

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