Поскольку размер битового поля не может быть вычислены с sizeof
, это может помочь:
#include <stdio.h>
struct foo {
signed int x: 4;
};
#define BIT(n) (1l << (n))
#define BIT_MASK(len) (BIT(len) - 1)
int main(void)
{
struct foo f = {0};
long i = 0;
while (f.x >= 0) {
f.x = BIT_MASK(++i);
}
printf("bits=%ld max=%ld\n", i, BIT_MASK(i));
return 0;
}
Сдвиг влево до f.x
отрицательно.
EDIT:
выше код определяется реализация, проверить это один, я думаю, что это будет работать (но вам приходится иметь дело с большим Endian):
#include <stdio.h>
#include <string.h>
struct foo {
signed int x: 4;
};
#define BIT(n) (1l << (n))
#define BIT_MASK(len) (BIT(len) - 1)
int main(void)
{
long x, i = 0;
struct foo f;
f.x = -1;
memcpy(&x, &f, sizeof(f));
while (1) {
if (!(x & BIT(++i))) break;
}
printf("bits=%ld max=%ld\n", i, BIT_MASK(i));
return 0;
}
Как вы можете см. теперь он не превышает 2^(n-1) -1 (работает на long
)
надежно можно хранить только '1111'. –
@GrijeshChauhan: «Не предполагая, что бит-поле всегда будет иметь ширину 4.» Сторонний разработчик может изменить ширину на 5 в следующей версии. Или 13. Или что-то еще. Я не хочу, чтобы мой код прерывался при изменении ширины битового поля. –
Я не получил :(, * 'Не предполагая, что бит-поле всегда будет иметь ширину 4' *, у него всегда будет 4-бит с любым компилятором ... я что-то упустил? –