Байт логика JavaScript - PullRequest
       7

Байт логика JavaScript

4 голосов
/ 22 октября 2010

Что означает этот код JavaScript?

flag &= ~CONST

Это добавление, добавление, пересечение или что-то еще?

Ответы [ 2 ]

8 голосов
/ 22 октября 2010

Посмотрите на Битовые операторы .


& Оператор

& ставит 1, где биты обоих операндов равны 1.

Пример

10000001 & 00000001 = 00000001  

~ Оператор

~ инвертирует биты.

Пример

~10000000 = 011111111;

flag &= ~CONST - это короткая рука для flag = flag & ~CONST;.

Возможно, вы видели нечто подобное, например, number *= 10.

5 голосов
/ 22 октября 2010

Это отключит любую константу.

Например, давайте рассмотрим гипотетический пример кода, который бы представлял состояние окна:

WS_HASBORDER           = 0x01;
WS_HASCLOSEBUTTON      = 0x02;
WS_HASMINIMIZEBUTTON   = 0x04;
WS_HASMAXIMIZEBUTTON   = 0x08;
WS_ISMAXIMIZED         = 0x10;

Мы могли бы представить «состояние» окна, используя
windowState = WS_HASBORDER | WS_HASCLOSEBUTTON | ... etc

Теперь, допустим, мы хотим "отключить" одно из этих состояний, ну, вот что делает ваш пример кода ... windowState &= ~WS_HASBORDER

Теперь, что делает приведенный выше код, он получает комплимент [я думаю, вы могли бы назвать его инвертированными битами] того, что справа от него, WS_HASBORDER.

Итак ... WS_HASBORDER имеет один бит, а все остальное выключено. В его комплимент включены все биты, кроме одного, который был отключен ранее.

Поскольку я представлял многие константы в байтах, я просто покажу вам пример [не то, чтобы javascript не представлял числа в байтах, и вы не можете это сделать]

WS_HASBORDER           = 0x01; //0000 0001
WS_HASCLOSEBUTTON      = 0x02; //0000 0010
WS_HASMINIMIZEBUTTON   = 0x04; //0000 0100
WS_HASMAXIMIZEBUTTON   = 0x08; //0000 1000
WS_ISMAXIMIZED         = 0x10; //0001 0000

_ сейчас для примера

windowState = WS_HASBORDER | WS_HASCLOSEBUTTON | WS_HASMINIMIZEBUTTON |
              WS_HASMAXIMIZEBUTTON | WS_ISMAXIMIZED;

     0000 0001
     0000 0010
     0000 0100
     0000 1000
and) 0001 0000
--------------
     0001 1111 = 0x1F

Итак ... windowState получает значение 0x1F

windowState & = ~ WS_HASMAXIMIZEBUTTON

 WS_HASMAXIMIZEBUTTON: 0000 1000  
~WS_HASMAXIMIZEBUTTON: 1111 0111

.. Для завершения нашего расчета

             windowState
&) ~WS_HASMAXIMIZEBUTTON

becomes
    0001 1111
&)  1111 0111
-------------
    0001 0111 = 0x07

Вот ваши итоговые флаги:
На:
WS_HASBORDER
WS_HASCLOSEBUTTON
WS_HASMINIMIZEBUTTON
WS_ISMAXIMIZED

Off:
WS_HASMAXIMIZEBUTTON

Надеюсь, это поможет. Вернуться к откладывать домашнее задание я иду! ха-ха.

...