ホームページ >バックエンド開発 >PHPチュートリアル >インタビュー質問:バイナリビット反転の実装アイデアの説明(PHP一般版)
これは面接の質問ですが、理解できないと表明した学生もいました。簡単なトレーニングをすることは難しくありませんが、完璧な比較を書くには基礎力が試され、論理的思考力も必要となります。生徒の方向性が PHP であるため、PHP を使用して説明します。また、PHP を学習することが重要ではないこともわかります。エコー「hello world」を 2 文書くか、Web ページにループ出力することができれば、PHP を呼び出すことができると言われています。
##1 、数値は 1 バイト、つまり 8 ビットを占めます。
たとえば、10 進数の 1 は、コンピュータでは 2 進数で 00000001 と表現されます (10 進数を 2 進数に変換するのを忘れた場合は、Baidu に問い合わせてください。以下の内容は理解できないので忘れてください~~~) PHP ではecho bindec("00000001"); //bindec函数可以让你体会到 二进制和10进制之间的 骚转换<br/>
#2 を使用できます。10 進数の加算 1 1 =2 (このヒントは非常に重要です) ~~、よく理解してください)
ディスプレイスメントでそれを行うにはバイナリを使用してください答え: 00000010 これは正確に 2 (2 の 1 乗) です。
答え: 00000011 これはちょうど 3 (2 の 1 乗、2 の 0 乗 = 2 1 = 3)
答え: 00000100 これは 4 (2 の 2 乗) です。
答え: 00000101 この男は 4 (2 の 2 乗、2 の 0 乗 = 4 1 = 5)
1. まず、2 つの変数 が必要です。
1) 一時変数は $xxoo と呼ばれ、初期値は 0 (10 進数)、バイナリでは 00000000 です。 2) 元の値変数は $shit と呼ばれ、00000101 ~2. 3 つのステップ
1) $xxoo を 1 ビット左に移動します 2) バイナリの最後の桁かどうかを判断します$shit の値は 1 です。そうであれば、$ を与えます。xxoo の 10 進数の値は 1 増加します。これを 2 進数とみなして 00000000 を 00000001 に変更することが非常に重要です。そうでない場合、$xxoo の初期値は 00000000 です。これはp ずつずらしてください。 。 。それらはすべて 0 なので、2 進数の最後のビットが 1 であるかどうかをどのように判断するのでしょうか?文字列または正規表現をインターセプトして判断する必要があります(不可能ではありません)回答: 元の値と 1 (つまり 00000001) の論理 AND 演算を実行するだけです (1&1 は 1) 、1&0 または 0&1 は常に 0)
3) 次に、$shit を 1 桁右に移動します
1) 元々 00000101 だった場合、00000010 になります移動後 (つまり、$xxoo と shit が同時に左に 1 つ、右に 1 つ移動されます。shit の最後のビットが 1 であれば、それを判断できるので、$ の最後のビットはxxoo も 1 に設定して、xxoo と shit の両方を実現します。同期と逆) 上記の処理を 8 回繰り返して、10100000function rev($n)<br/>{<br/> $xxoo = 0;<br/> for ($i = 0; $i < 8; $i++) {<br/> $xxoo = $xxoo << 1;<br/> if (($n & 1) == 1) {<br/> $xxoo++;<br/> }<br/> $n = $n >> 1;<br/> }<br/> return $xxoo;<br/>}<br/>echo decbin(rev(5));<br/>
ただし、注意してください。上記の関数は半角数字をサポートしています (8 桁のみをサポートしています)
オンライン面接の質問は 32 です。 -bit 数値、および次のコードは一般数字 (このコードはオンラインでは利用できません~~~)。考えて理解しましょう。あまり説明はしません。PHP コードのスキルが必要です:
function rev($n)<br/>{<br/> $num=intval(strlen(decbin($n))/8); //整除 8<br/> if($num==0)<br/> $bitLen=8;//最小8位<br/> else<br/> {<br/> if((strlen(decbin($n)) % 8)>0)<br/> $bitLen=($num+1)*8;<br/> else<br/> $bitLen=$num*8;<br/> }<br/> echo “原始值二进制:”.str_pad(decbin($n),$bitLen,’0′,STR_PAD_LEFT).”<br/>”;<br/> $xxoo = 0;<br/> for ($i = 0; $i < $bitLen; $i++) {<br/> $xxoo = $xxoo << 1;<br/> if (($n & 1) == 1) {<br/> $xxoo++;<br/> }<br/> $n = $n >> 1;<br/> }<br/> echo “反转后值二进制:”.str_pad(decbin($xxoo),$bitLen,’0′,STR_PAD_LEFT).”<br/>”;<br/> return $xxoo;<br/>}<br/>
echo rev(4);<br/>echo rev(43261596);<br/>
原始值二进制:00000100<br/>反转后值二进制:00100000<br/>32原始值二进制:00000010100101000001111010011100<br/>反转后值二进制:00111001011110000010100101000000<br/>964176192<br/>
以上がインタビュー質問:バイナリビット反転の実装アイデアの説明(PHP一般版)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。