2014-12-28 2 views
0

Если бы я встретил что-то вроде этого:Используйте маски для оценки бит uint512

uint32_t mask = 8; 
uint32_t zero = 0; 
uint32_t foo[16]; 
... 
if ((foo[0] & mask) != zero) 
... 

условия просто проверяет первые 8 бит обув [0], который представляет собой 32-битовое беззнаковое внутр.

Если у меня есть то же значение, ранее сохраненное в foo [16], теперь в переменной uint512, как я могу получить такое же условие?

Поскольку foo [0] - первый слот вектора, это означает, что я предварительно проверил первые 8 бит первого слота, поэтому могу ли я просто использовать это?

if (("uint512 variable" & mask) != zero) 
+2

Состояние * не * Проверьте первый 8 бит 'foo [0]', он проверяет бит 4. Если вы хотите проверить 8 первых бит, используйте, например, '0xff'. –

+2

Какой тип 'uint512'? 512-битное целое без знака? –

+3

Кроме того, хотя полезно избегать «магических чисел», сравнение бит-операции с * literal * zero (то есть '0') обычно приемлемо. Использование * переменных * для констант, таких как нуль, в будущем заработает вам место на http://thedailywtf.com/ –

ответ

1

Прежде всего,

условие просто проверяет первые 8 битов Foo [0], который представляет собой 32-битовое беззнаковое Int.

Я думаю, вы имеете в виду первые 32 бита - foo[0] - это первый элемент, который является 32-разрядным держателем.

Предполагая, что есть uint512, я не понимаю, что именно вы хотите достичь, но я думаю, что это одна из двух вещей:

  1. Проверить все uint512 как единое целое с помощью 512-битного Маска как это:

    uint512_t mask = 8; 
    uint512_t zero = 0; 
    uint512_t foo; 
    ... 
    if ((foo & mask) != zero) 
    ... 
    
  2. Проверить 8-битовый срез переменных 512 бит. В этом случае вы не можете просто получить его как версию массива. Это связано с тем, что в зависимости от конечности целевой машины первые 8-бит могут быть самыми значимыми или наименее значимыми 8-битными.

Если вы хотите, чтобы проверить наиболее значимые биты:

uint32_t mask = 8; 
uint32_t zero = 0; 
uint512_t foo; 
... 
if ((uint32_t)(foo >> 480) & mask) != zero) 
... 

Если вы хотите проверить, младшие биты:

uint32_t mask = 8; 
uint32_t zero = 0; 
uint512_t foo; 
... 
if (((uint32_t)foo & mask) != zero) 
... 
+0

В основном я адаптирую часть кода, не написанную мной. Старый код содержит вектор uint32_t, содержащий хеш (разделенный между слотами 16 * 32 бит, которые я предположил). У моего кода вместо этого есть переменная uint512, содержащая этот хеш. Мне нужно получить тот же результат из условия «If ((foo [0] & mask)!= 0) ", используя мою переменную uint512 вместо foo [0]. Если я хорошо понимаю ваш ответ, кажется, я могу просто использовать« if ((«my uint512» & mask)! = 0) », чтобы получить тот же результат старого «если» условного. – sciakysystem

Смежные вопросы