Очень простая маскировка - PullRequest
       9

Очень простая маскировка

0 голосов
/ 08 сентября 2011

В 3 операциях как я могу превратить байт в 32-битное целое число, которое соответствует этому:

0x1fffe

Я могу только явно получить доступ к байту за раз, поэтому я начинаю с 0xFF и затем сдвигаю его.

Я могу сделать это, используя 4 операции, но не могу найти способ устранить одну операцию.

    int mask2 = 0xFF << 8;
    mask2 = mask2 | 0xFE;
    mask2 = mask2 + mask2;
    mask2 = mask2 | 0x02;

Есть идеи?

Другими словами, мне нужна маска, 0x1FFFE, которую нужно сделать за 3 операции при одновременном доступе к байту за раз , как в примере.

Ответы [ 5 ]

2 голосов
/ 08 сентября 2011

shift, add, shift, это три операции, верно?

((0xff << 8) + 0xff) << 1

2 голосов
/ 08 сентября 2011

Может быть, это то, что вам нужно ... вы начинаете с одного байтового значения (0xff) и работаете с ним с 3 побитовыми операциями, получая 0x1fffe.

int in = 0xff;
int out = in<<9 | in<<1;
1 голос
/ 08 сентября 2011

с двумя операциями:

res = (1 << 17) - 2
0 голосов
/ 08 сентября 2011

Как насчет этого:

((~0xffU) >> 11) - 1

Это предполагает 32-битные целые числа ...

Может быть, это лучше выразить как:

uint32_t x = 0xff;

x = ~x;
x >>= 11;
x -= 1;
0 голосов
/ 08 сентября 2011
int mask2 = 0xFF;
mask2 |= mask2 << 8;
mask2 += mask2;
...