Инвертировать побитовое смещение влево и присвоение ИЛИ

Какова была бы обратная функция для этого?

A = (B << 3) | 0x07;

Как я могу получить B когда у меня уже есть соответствующий A?

7

Решение

Вы никогда не сможете восстановить все биты полностью.

B << 3 сдвигает «B» на три бита влево, и он не зацикливается. Это означает, что состояние первых трех битов B стерто — если вы не знаете их, вы не сможете восстановить B.

Пример:

10101101 << 3

Turns: 10101101
^---^
Into:  01101000
^---^

Три верхних бита потеряны, а нижние три заполнены нулями. Удаленные данные удалены.

| 0x07 заполняет нижние три бита (с 111), поэтому даже если бы вы не сдвинулись, вы удалили бы младшие три бита с помощью 111делая эти биты невосстановимыми.

Теперь, если бы это был XOR вместо OR, его можно было бы восстановить с помощью другого XOR:

A ^ same-value Можно расстаться с другим A ^ same-value так как ((A ^ B) ^ B) == A

A | same-value не могу расстаться с другим A | same-value

A | same-value также не могу быть отмененным с помощью AND: A & same-value

Но сдвиг все равно вызовет проблемы, даже если это будет XOR (что не так).

15

Другие решения

Дано (Использование 8-битного B как пример, используя0b только для двоичной формы, только для демонстрации)

B = 0b00000000
B = 0b00100000
//...
B = 0b11100000

Вы можете получить то же самое A, поэтому я не думаю, что вы можете изменить расчет, потеряны 3 самых левых бита.

1

По вопросам рекламы [email protected]