ホームページ >バックエンド開発 >PHPチュートリアル >インタビュー質問:バイナリビット反転の実装アイデアの説明(PHP一般版)

インタビュー質問:バイナリビット反転の実装アイデアの説明(PHP一般版)

angryTom
angryTom転載
2019-10-15 10:18:554920ブラウズ

これは面接の質問ですが、理解できないと表明した学生もいました。簡単なトレーニングをすることは難しくありませんが、完璧な比較を書くには基礎力が試され、論理的思考力も必要となります。生徒の方向性が PHP であるため、PHP を使用して説明します。また、PHP を学習することが重要ではないこともわかります。エコー「hello world」を 2 文書くか、Web ページにループ出力することができれば、PHP を呼び出すことができると言われています。

# ここでいくつかの知識を紹介します: (推奨される学習: 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 乗) です。

10 進数の 2 1=3 はどうでしょうか?


答え: 00000011 これはちょうど 3 (2 の 1 乗、2 の 0 乗 = 2 1 = 3)

では、10進数の3 1=4はどうでしょうか?


答え: 00000100 これは 4 (2 の 2 乗) です。

それでは、10 進数の 4 1=5 はどうでしょうか?


答え: 00000101 この男は 4 (2 の 2 乗、2 の 0 乗 = 4 1 = 5)

問題の解決を開始します

2 進数 00000101 があるとします。今度はそれを逆さまにして 10100000 に変える必要があります。どうやって遊ぶのですか?

答えはインターネット上にたくさんあるので、以下のアイデアについて話しましょう:


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 回繰り返して、10100000

完全なコードは次のとおりです。以下に続きます
function 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/>

Call test
echo rev(4);<br/>echo rev(43261596);<br/>

結果
原始值二进制:00000100<br/>反转后值二进制:00100000<br/>32原始值二进制:00000010100101000001111010011100<br/>反转后值二进制:00111001011110000010100101000000<br/>964176192<br/>

以上がインタビュー質問:バイナリビット反転の実装アイデアの説明(PHP一般版)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はwww.hishenyi.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。