1

重複の可能性:
ビットシフトと加算のみを使用して乗算と除算を行うにはどうすればよいですか?

ループ制御以外の算術演算子を使用せずに、2進数の減算、乗算、除算を実行する関数を作成する必要があります。私は今までJavaでコードを書いただけなので、これに頭を悩ませるのに苦労しています。

減算から始めて、プロトタイプで関数を書く必要があります

int bsub(int x, int y)

yを負にしてxに加算するには、yを2の補数に変換する必要があることはわかっていますが、これを行う方法は、1の補数〜演算子を使用して1を加算することによってのみわかりますが、+演算子は使用できません。

badd関数が提供されましたが、yaを負の数にする方法がわかれば、bsubで実装できるようになります。baddのコードを以下に示します。ヒントを事前に感謝します。

int badd(int x,int y){

int i;

char sum;
char car_in=0;
char car_out;
char a,b;

unsigned int mask=0x00000001;
int result=0;

for(i=0;i<32;i++){

  a=(x&mask)!=0;
  b=(y&mask)!=0;
  car_out=car_in & (a|b) |a&b;
  sum=a^b^car_in;

  if(sum) {
     result|=mask;
  }

  if(i!=31) {
     car_in=car_out;
  } else {
     if(car_in!=car_out) {
        printf("Overflow occurred\n");
     }
  }

  mask<<=1;
  }

 return result;
  }
4

2 に答える 2

8

+または演算子を使用せずにビット単位の演算で減算するの-は少し注意が必要ですが、実行できます。補足の基本的な考え方はありますが、使用し+ないと少し注意が必要になります。

最初にビット単位でのみ加算を設定し、次にそれを使用して減算を実行することで、これを行うことができます。これは補完に使用されるため、コードは次のようになります。

int badd(int n1, int n2){
    int carry, sum;
    carry = (n1 & n2) << 1; // Find bits that are used for carry
    sum = n1 ^ n2; // Add each bit, discard carry.
    if (sum & carry) // If bits match, add current sum and carry.
        return badd(sum, carry);
    else
        return sum ^ carry; // Return the sum.
}

int bsub(int n1, int n2){
    // Add two's complement and return.
    return badd(n1, badd(~n2, 1));
}

そして、例で上記のコードを使用すると、次のようになります。

int main(){
printf("%d\n", bsub(53, 17));
return 0;
}

どちらが返ってしまうか36。そして、それが減算がビット単位のみの演算でどのように機能するかです。

その後、乗算と除算はより複雑になりますが、実行できます。これらの2つの操作では、シフトを加算および/または減算とともに使用して、ジョブを実行します。また、この質問とその方法に関するこの記事を読むこともできます。

于 2012-09-21T22:20:54.260 に答える
-1

最初にバイナリ加算を実装する必要があります。

4ビットの例:

a = 1101 b = 1011

マスクの範囲は0001から1000です

for (i=0;i<4;i++) {
    x = a & pow(2, i); //mask, you can shift left as well
    y = b & pow(2, i);
    z = x ^ y; //XOR to calculate addition
    z = z ^ carry; //add previous carry
    carry = x & y | x ^ carry | y ^ carry; //new carry
}

これは擬似コードです。マスクは、左から右へビットごとに操作することを可能にします。zを別の変数に便利に格納する必要があります。

足し算ができたら、1'を足して1を足し算することで引き算を実行できるようになります。

乗算も同じように行われますが、少し難しくなります。基本的には、学校で学んだのと同じ分割方法で、マスクを使用してビットを便利に選択し、上記の加算を使用して中間結果を加算します。

除算はもう少し複雑で、説明するのにもう少し時間がかかりますが、基本的には同じ原理です。

于 2012-09-21T22:22:51.520 に答える