1

私は今日、私の学部 (セルビアのベオグラードの数学学部) で次のような課題を受け取りました。

1) 与えられた 2 つの整数 x と y について、y の対応するビットに一致するビットを整数 x で反転し、残りのビットは同じままにするプログラムを作成します。

例えば:

x  = 1001110110101
y  = 1100010100011
x' = 0011101011100

私はそれを行うプログラムを書くことができましたが、ソリューションの品質について少し不安です. 時間があれば、コードをチェックして、どうすれば改善できるか教えてください。

int x, y, bitnum;
int z = 0;
unsigned int mask;

bitnum = sizeof(int) * 8;
mask = 1 << bitnum - 1;

printf("Unesi x i y: ");
scanf("%d%d", &x, &y);

while (mask > 1) {
    if ( (((x & mask) == 0) && ((y & mask) == 0)) ||
          ((x & mask) && ((y & mask) == 0)) )
        z += 1;                                   
    z <<= 1;
    mask >>= 1;
} /* <-- THAT'S HOW STUPID PEOPLE SOLVE PROBLEMS... WITH HAMMER! */
z = y~; /* <-- THAT'S HOW SMART PEOPLE SOLVE PROBLEMS... WITH ONE LINE */

たとえば、x = 423 と y = 324 の場合、すべてが正しく機能します。z = -344 が得られます。これは正しいです。また、ビットプリントが一致します。これを行うためのより良い方法があるかどうかを知りたいです。

ありがとう。

4

2 に答える 2

0

x//の例を見るとyx'それx'が を補完するものであることがわかるはずですy。と、まさしくその通りです。

 x  y  x'
 --------
 1  1  0
 0  0  1
 1  0  1
 0  1  0

ネタバレ (解決策を見たい場合は、マウスを下のブロックに合わせてください):

一致するビットについては、ビットインを反転しますがx、ビットインと同じなので、ビットインyを反転するのと同じyです。一致しない場合は、 からビットを保持しますx。これは、すでにビットが反転しているものyです。1行のソリューションをすでに自分で確認できることを願っています:x' = ~y;

于 2013-04-12T05:46:48.847 に答える