Используйте маски для оценки битов uint512

0

Если бы я встретил что-то вроде этого:

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

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

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

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

if (("uint512 variable" & mask) != zero)
  • 2
    Условие не проверяет первые 8 бит foo[0] , оно проверяет только бит 4. Если вы хотите проверить 8 первых бит, то используйте, например, 0xff .
  • 2
    Какой тип uint512 ? 512-битное целое число без знака?
Показать ещё 3 комментария
Теги:
operators
bit

1 ответ

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)", чтобы получить тот же результат, что и старое условное выражение "if".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню