Побитовый оператор И - используется ли для уменьшения предыдущего битового интервала? - PullRequest
0 голосов
/ 22 февраля 2020

Я не уверен, как сформулировать topi c для этого вопроса, потому что я новичок в битовой манипуляции и действительно не понимаю, как она работает.

Я нахожусь в процессе реверс-инжиниринга игровое приложение просто чтобы посмотреть, как оно работает, и захотело выяснить, как именно оператор '&' используется в методе.

Частичный код:

int n = (random numbers will be provided below)
int n2 = n & 1920 // interested in this line of code
switch (n2){
//ignore n2 value assignment inside of cases
    case 256: {
        n2 = 384;
        break;
    case 384: {
        n2 = 512;
        break;
    case 512: {
        n2 = 0
        break;

Тестовые значения:

Input Values | Output Values | Substituting Values
n = 387      | n2 = 384      | ( 387 & 1920 ) = 384
n = 513      | n2 = 512      | ( 513 & 1920 ) = 512
n = 12546    | n2 = 256      | ( 12546 & 1920 ) = 256
n = 18690    | n2 = 256      | ( 18690 & 1920 ) = 256

На основании этого варианта использования у меня есть несколько вопросов:

Что делает оператор & в этом примере?

  • Мне кажется, что большинство значений округляется до ближайшего битового интервала, за исключением чисел, превышающих 10000

Что такого важного в номер 1920?

Как они пришли к этому номеру, чтобы получить заданный c битовый интервал? (если можно выяснить)

Ответы [ 2 ]

3 голосов
/ 22 февраля 2020

Первое, что вам нужно сделать, чтобы понять битовую манипуляцию, - это преобразовать все десятичные числа из base-10 в числовой формат, показывающий биты, то есть двоичные числа base-2 или шестнадцатеричные числа base-16 (если вы узнали читать их пока).

Биты нумеруются справа, начиная с 0.

Decimal     Hex            Binary
    256 = 0x100 =   0b1_0000_0000
    384 = 0x180 =   0b1_1000_0000
    512 = 0x200 =  0b10_0000_0000
   1920 = 0x780 = 0b111_1000_0000
                    | | |  |    |
                   10 8 7  4    0   Bit Number

Как видите, n & 1920 удалит все, кроме битов 7-10.

Пока n не имеет установленных битов больше 10, то есть больше 0x7FF = 2047, эффект, как вы заявили, значения округляются (усекаются) до ближайшего битового интервала, то есть кратное 128.

0 голосов
/ 22 февраля 2020
128 + 256 + 512 + 1024 = 1920.

These are also powers of 2.  let ^ be power of.

128 = 2^7 
256 = 2^8 
512 = 2^9
1024 = 2^10

Показатель степени также представляет местоположение бита в числе, идущем справа налево, начиная с бита 0.

Путем AND для значения a с 1920 вы можете увидеть, есть ли биты

Допустим, вы хотели посмотреть, был ли установлен n, если был установлен только бит 7.

if ((n & 1920) == 128) {
   // it is set.
}

Или посмотреть, были ли установлены биты 7 и 8.

if ((n & 1920) == 384) {
  //  then those bits are set.
} 

Вы также можете установить определенный бит, используя |.

n |= 128.  Set's bit 7 to 1.
...