$a=8;$b=~$a; //按位取反echo "/$a=".$a."<br>";echo "/$b=".$b;
輸出結(jié)果:
$a=8$b=-9
結(jié)果跟我所想的不一樣啊,因?yàn)樵赑HP中文手冊(cè)中說: ~ $a Not(按位非) 將 $a 中為 0 的位設(shè)為 1,反之亦然。 我只是簡(jiǎn)單的理解為:0變1,1變0。原來按位取反以十進(jìn)制輸出并不是簡(jiǎn)單理解成這樣。
首先要知道,在計(jì)算機(jī)中,負(fù)數(shù)以其正值的補(bǔ)碼形式表達(dá)。
這樣我們就要知道三個(gè)概念了,原碼,反碼和補(bǔ)碼。
原碼:一個(gè)整數(shù),按照絕對(duì)值大小轉(zhuǎn)換成的二進(jìn)制數(shù),稱為原碼。
反碼:將二進(jìn)制數(shù)按位取反,所得的新二進(jìn)制數(shù)稱為原二進(jìn)制數(shù)的反碼。取反操作指:1變0, 0變1。
補(bǔ)碼:反碼加1稱為補(bǔ)碼。也就是說,要得到一個(gè)數(shù)的補(bǔ)碼,先得到反碼,然后將反碼加上1,所得數(shù)稱為補(bǔ)碼。
正數(shù)的補(bǔ)碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1
由上所知,8按位取反以十進(jìn)制輸出的過程:
1、8的原碼為:0000 0000 0000 0000 0000 0000 0000 1000
2、按位取反:1111 1111 1111 1111 1111 1111 1111 0111;由于最前面一位為1,所以為負(fù)數(shù)。即即按位取反后得的為負(fù)數(shù)
下面以十進(jìn)制輸出:負(fù)數(shù)以其正值的補(bǔ)碼形式表達(dá):
3、2步所得的數(shù)(是其正為取反,符號(hào)不變,最高位還是為1)取反:1000 0000 0000 0000 0000 0000 000 1000
4、反碼加1:1000 0000 0000 0000 0000 0000 000 1001;這樣就得負(fù)數(shù)的正值的補(bǔ)碼形式。也就是-9了。
再舉一例子啊。如2按位取反。
0000 0000 0000 0000 0000 0000 0000 0010(原碼)
1111 1111 1111 1111 1111 1111 1111 1101(按位取反)
1000 0000 0000 0000 0000 0000 000 0010 (正值的反碼,符號(hào)不變)
1000 0000 0000 0000 0000 0000 000 0011 (加1,結(jié)果為-3)
代碼和結(jié)果如下:
<?php$a=2;$b=~$a; //按位取反echo "/$a=".$a."<br>";echo "/$b=".$b;?>
結(jié)果:
$a=2$b=-3
以上就是php 位運(yùn)算中的按位取反到底什么意思?的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注 其它相關(guān)文章!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選