Как я могу показать битовый шаблон для этого типа? - PullRequest
0 голосов
/ 19 февраля 2020

Например, если я сделаю:

  let sieve = new Uint32Array(1).fill(1);

Я хотел бы взглянуть на битовую комбинацию с индексом 0, которая должна быть

0000000000000000000000000001

Я хочу распечатать его на консоли, чтобы получить что-то вроде этого:

0 0
1 0
2 0
3 0
.
.
.
31 1

Могу ли я просто сдвинуть вправо, чтобы взять 1, используя >>, или мне нужно использовать побитовое И а также &?

Как сторона, это влияет на вещи, если вы переключаетесь на подписанное представление, например здесь ...

Int32Array

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Это просто преобразование числа в двоичное.

let arr = new Uint32Array(1).fill(1);
for (let i = 0; i < 32; i++) {
  console.log(i, (arr[0] >>> i) & 1);
}

Фактически, тот факт, что число взято из Uint32Array, не имеет значения, но, возможно, это потому, что вы упростили свой вопрос.

Также обратите внимание, что бит "единицы", который вы хотите, чтобы в вашем вопросе было напечатано как 31, на самом деле является первым битом, потому что биты отсчитываются, начиная с нуля справа (младший значащий бит). Если вы действительно хотели считать это нестандартным способом, как в вопросе, то:

let arr = new Uint32Array(1).fill(1);
for (let i = 0; i < 32; i++) {
  console.log(i, (arr[0] >>> (31 - i)) & 1);
}

Редактировать : для правильных значений, даже если установлен MSB («знаковый бит»), смещение битов без знака ( >>>) должен быть использован.

1 голос
/ 19 февраля 2020

Нет ничего особенного, что связано с Uint32Array ... Вы можете просто иметь дело с sieve[0], как и с любым целым числом:

let sieve = new Uint32Array(1).fill(1);

console.log(
    Array.from(sieve[0].toString(2).padStart(32, 0), (bit, i) => `${i} ${bit}`)
         .join("\n")
);
...