0

私は最近、自分自身で Java の学習を始めましたが、特に 1 つの部分で問題が発生しています。今日、ビット値のシフトについて読みましたが、私がやっていることは正しいのでしょうか?

値を右に 16 ビット シフトしてから、値を 8 ビット マスクの 1 で AND 演算して上位 24 ビットをクリアしたいと考えています。ここに私のコードの一部があります:

int shift(){
    point = point >> 16; //shifts the value to the right by 16 bits
    point = point & 0xFF; //clear the upper 24 bits
    return point;
  }

これは正しいです?このテクニックを正しく使用していますか?

ありがとう!

4

2 に答える 2

4

はい。
30 文字の最小長を満たすためのコンテンツ

OK、そのジョークは評判が悪いようですが、この風刺的な答えを人々が気に入ってくれることを期待していました。ま、SOの人は思ったより真面目なようです。

まあ、他の人が言ったように、実際に自分でチェックすることができます!

コードのコメントに書いたように、コメント (人間の理解) をコード (機械の理解) に変換することは既に正しく行われています。

あなたが正しいことをどうやって知ることができますか? さて、あなたはオンラインリソースをチェックすることができます:

  1. ビット操作
  2. または、このウィキペディアのエントリだけ

これらのリソースを参照した後、これまでのところ、コードは意図と一致しているようです。

しかし、それは理論上の話だとおっしゃいましたが、どうすれば自分の答えが正しいことを経験的に知ることができるでしょうか?

さて、あなたはこの方法を行うことができます:

  1. いくつかのサンプル テスト ケースを作成します。
    この場合、簡単に確認できるように16進数を使用できます(各ビットが表示されるため)。
    例: 0xFFFFFFFF0x80000000、 を試してください0xC0C0C0C0
  2. 正しい答えを手動で見つけます。
    この場合、(ペンと紙を使用して) 自分でビットをシフトしてみてください。すべて 1 の 32 ビットの数値である
    について0xFFFFFFFF、16 ビットを右にシフトすると0x0000FFFF、1 のみの 32 ビットの数値であるが得られます。最後の 16 ビット。次に、最後の 8 ビットのみが 1 の 32 ビットの数値である
    との AND 演算を行います。最後の 8 ビットでのみ両方の数値のビットが 1 になるため、0xFFこれでも が得られます 。他の例についても繰り返します。他の例では、andを取得する必要があります。0xFF
    0x000xC0
  3. それらの入力でコードを実行します。
    コードを実行するには、Java コンパイラと呼ばれるものを使用できます (通常、ほとんどのシステムでは javac と呼ばれます)。
    あなたが本当に初心者なら、このようなオンライン コンパイラを試すことができます。そこにコードを置いて実行するだけです (ここ
    で説明されている入力/出力 (I/O) 管理を使用して)
  4. 出力をプログラムの出力と比較します。
    通常、これだけで、コードが正しいという確信が得られます。
    しかし、いくつかの小さな例では正しくても、コードが正しくないというトリッキーなケースが時々あります。幸いなことに、上記の理論的な答えを使用してロジックを確認済みです。

だから私はそれが役立つことを願っています!

于 2013-10-01T06:28:13.417 に答える