LINUX.ORG.RU

История изменений

Исправление gentoo_root, (текущая версия) :

short res = (1 << 10) | ((a & 31) << 5) | (b & 31);

Можно ещё заюзать union, struct и битовые поля:

union {
    struct {
        unsigned b : 5;
        unsigned a : 5;
        unsigned h : 1;
    } in;
    short out;
} u;
u.out = 0;
u.in.b = b;
u.in.a = a;
u.in.h = 1;
short res = u.out;

Возможно, второе не взлетит на big endian.

Исправление gentoo_root, :

short res = (1 << 10) | ((a & 31) << 5) | (b & 31);

Можно ещё заюзать union, struct и битовые поля:

union {
    struct {
        unsigned b : 5;
        unsigned a : 5;
        unsigned h : 1;
    } in;
    short out;
} u;
u.in.b = b;
u.in.a = a;
u.in.h = 1;
short res = u.out & ((1<<11) - 1);

Возможно, второе не взлетит на big endian.

Исправление gentoo_root, :

short res = (1 << 10) | ((a & 31) << 5) | (b & 31);

Примерно так, не проверял. Можно ещё заюзать union, struct и битовые поля:

union {
    struct {
        unsigned b : 5;
        unsigned a : 5;
        unsigned h : 1;
    } in;
    short out;
} u;
u.in.b = b;
u.in.a = a;
u.in.h = 1;
short res = u.out & ((1<<11) - 1);

Возможно, второе не взлетит на big endian.

Исправление gentoo_root, :

short res = (1 << 10) | ((a & 31) << 5) | (b & 31);

Примерно так, не проверял. Можно ещё заюзать union, struct и битовые поля:

union {
    struct {
        unsigned b : 5;
        unsigned a : 5;
        unsigned h : 1;
    } in;
    short out;
} u;
u.in.b = b;
u.in.a = a;
u.in.h = 1;
short res = u.out;

Это тоже не проверял. Возможно, не взлетит на big endian.

Исходная версия gentoo_root, :

short res = (1 << 10) | ((a & 31) << 5) | (b & 31);

Примерно так, не проверял. Можно ещё заюзать union, struct и битовые поля.