1

整数値をキーボードから int 型の変数に読み込み、8 で割ったときの正の剰余を決定するためにビット演算子の 1 つ (つまり、% 演算子ではない!) を使用するプログラムを作成します。

たとえば、29 = (3x8)+5 と 14 = ( 2x8)+2 を 8 で割ると、それぞれ正の剰余 5 と 2 になります。

どうすれば解決できるのか調べてみました。私がしたことは、与えられた例の数値をバイナリに分解することです。

29 => 101001
8  => 001000
5 =>  000101

結果5をバイナリで取得するために29と8で何をすべきかわかりません。

検索中に、何人かの人が私たちがやるべきだと言っています (& 7 での操作)

remainder = remainder & 7 ;

次に、Value自体でこれを実行しようとしました

value = value & 7 ; 

そしてこれが私のコードですそれをやった後...

#include <iostream>

using std::cout;
using std::endl;
using std::cin;

int main()
{
  int value = 0;
  int divisor = 8;
  int remainder = 0;

  cout << "Enter an integr and I'll divide it by 8 and give you the remainder!"
       <<endl;
  cin >> value;

  value = value & 7;
  remainder = value & divisor;
  cout << remainder;

  return 0;
}

値 29 を使用すると、結果が 0 になりました。自分が書いたことが正しいかどうかはわかりません。

4

2 に答える 2

3

単純&に数字そのものを 7 にします。また、29 = 0b11101. 一般化すると、ある数値2 ^ nで割った余りは( == の累乗) を使用して求められます。&(2 ^ n) - 1^

したがって、剰余 を取得するmodulo 16には、&15 などを使用します。

于 2012-12-09T12:52:05.797 に答える
2

8は正確2^3にであるため、任意の数値のモジュロ8の余りは、最後の3つの2進数で構成されます。つまり、ビット単位の数値と等しくなります。7:

unsigned rem8 = number & 7;

(7は111バイナリであるためです。)

于 2012-12-09T12:53:58.357 に答える