I am learning Bitwise Operators and for that I pulled out an article on tutsplus. Well, it is written quite nicely. I could understand the &
and |
operator but the ~
is messing things up. For example, as stated there in the article:
In fact, just as ! flips a boolean from true to false or vice versa, the ~ operator reverses each binary digit in an integer: from 0 to 1 and 1 to 0.
The article has assumed that the OS is storing integer as 1 byte
or 8 bits
. I am following it. I am using PHP for experimenting. The code's below:
$b = 12;
$NOR = ~$b;
/*
* ------------------------
* | $b | 0 0 0 0 1 1 0 0 | = 12
* ------------------------
* | ~ | 1 1 1 1 0 0 1 1 | = 243 as 1 + 2 + 16 + 32 + 64 + 128 = 243
* ------------------------
* Each digit will be inverted.
*/
echobr($NOR);
Even if we consider that $b
was stored as 32 bit
. Then the inverted value should be > 243
. Instead, it returns -13
. echobr()
is the function I defined.
If it can be explained, it will be very helpful.
$b = 0000 0000 0000 0000 0000 0000 0000 1100
~$b = 1111 1111 1111 1111 1111 1111 1111 0011 = -13
Note that PHP uses the two's complement representation which means that the most significant bit is the sign bit, here '1' refers to '-'. You can read more about the sign bit here Sign bit-Wikipedia.
As a matter of fact, for any signed integer in PHP, -$i == ~$i + 1