В следующем коде VB. NET (i And 1) = 1, как оператор «И» используется как оператор модуля «%», чтобы узнать, четное или нечетное i? - PullRequest
0 голосов
/ 16 марта 2020

Книга, из которой я нашел этот фрагмент кода, использует четные числа в некотором диапазоне. Оператор «И» действовал в точности как оператор модуля и возвращал либо 1 в случае нечетных чисел, либо ноль в случае четных чисел.

1 Ответ

2 голосов
/ 16 марта 2020
Let's pick a number: 345 looks nice

In binary: ‭000101011001‬ (I used the windows calculator to give me this, 
                         rather than get into anything deeper)

Now if we AND it with 1 (000000000001 in binary), that's a bit masking 
operation. When we bit mask we compare the truth of the numbers in the 
same column, and only record a 1 in that column for the result when both 
the number above are 1:

    ‭000101011001‬
AND 000000000001  
    ^
    0 and 0 is 0

    ‭000101011001‬
AND 000000000001  
     ^
     0 and 0 is 0

    ‭000101011001‬
AND 000000000001  
      ^
      0 and 0 is 0

    ‭000101011001‬
AND 000000000001  
       ^
       1 and 0 is 0

...

    ‭000101011001‬
AND 000000000001  
               ^
               1 and 1 is 1



This means the result is:


    ‭000101011001‬
AND 000000000001   
=   000000000001 (i.e. the result of masking 345 with 1 is 1)

So this number had a binary 1 at the right hand side of its representation, and it's an ODD
number. All odd numbers have a 1 at the right hand side of their representation:

  1: 0001
  3: 0011
  5: 0101
  7: 0111
  9: 1001

Masking any of them with 1 will reliably produce a result of 1,
and we can hence check the result to be 1 to know the input number was odd
...

The opposite is true for even numbers, they always finish with a 0. Take 344 for example:

 344: ‭0001010110010 <--it's like 345, except one less
 AND  0000000000001
   =  0000000000000 <-- the result is 0. 346 is EVEN. Even numbers always have
                        a 0 in the right hand side of their binary representation


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...