#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:
Нет, таких функций нет в стандартной библиотеке. Кроме того, язык не гарантирует, что ваши предположения о порядке битовых полей совпадают с реализацией языка.