神奇的位非運算

勺顛顛發表於2019-08-31

php位運算

<?php
echo ~48&~75;
/**
 * 最好了解下二進位制的四則運算和位運算以及運算電路的相關涉及知識^_^
 * 48的二進位制值是:00110000 十六進位制值是:ffffff30【我係統是64位的輸出的結果就是這樣】
 * 其實呢計算機記憶體在儲存資料的時候會把負數轉換為補碼儲存【正數的原碼,反碼,補碼完全一樣】
 * 而負數呢最高位為1用於表示負數,它的反碼呢和正數是相反的,需要將0轉換為1,1轉換為0,補碼操作就是加1操作
 * 當然不同位數的記憶體長度不一樣
 *
 * 75的二進位制值是:01001011[我按8位算] 【如果是16位的就是:11111111 01001011,32位,64位的也是同樣的道理】
 * echo ~48;//結果為-49
 *          //1、轉換為二進位制時結果為:00110000【64位系統十六進位制就是ffffff30】
 *          //2、此時反碼為:11001111【64位系統十六進位制就是ffffffcf】
 *          //3、減1操作為:11001110 【64位系統十六進位制就是ffffffce】【11111111 11111111 11111111 11001110】
 *          //4、還原為:00110001【64位系統十六進位制就是80000031】【二進位制為:10000000  00000000 00000000 00110001】
 *          //5、二進位制求和結果為:1+16+32=49【注意二進位制的最高位1表示負數】輸出的結果是:-49
 *
 * echo ~75;//結果為-76,一樣的套路
 *
 * echo ~48&~75;//結果卻是124
 * 1、48的反碼結果為:1100 1111
 * 2、75的的碼結果為:1011 0100
 * 3、它們倆相與結果為:1000 0100  【十六進位制為:ffffff84】【減1操作後為ffffff83】【自己想想十六進位制如何數數^_^】
 * 4、還原後為:0111 1100【十六進位制為:8000007c】【二進位制結果為:10000000  00000000 00000000 01111100】
 * 5、求和結果為:-124
 */

它的結果是:-124!!!
神奇的位非運算
其實這是基礎了,對於一些牛人確實沒有什麼卵用【不過有的朋友還真問我了,有些小夥伴還真不知道結果是如何運算出來的,做學問在於細節嘛,切勿浮躁自大^_^】

jackChen

相關文章