-1

試験の準備をしていて、この質問に行き詰まりました。許可された演算子は<<,+,& 、ループが許可されておらず、最小一時変数です。4ビットの数値(char)を取得し、ミラーリングされた(中央に対して)ビットを返す関数をCで記述します。例:与えられたb4,b3,b2,b1リターンb1,b2,b3,b4

O_oありがとう!

明確ではないかもしれませんが、一般的な言語ツールは許可されています('=='、if、>、<など)。

4

1 に答える 1

2

これは、演算子のみの制約と<<, +, &return以外の他の構造がないため、不可能です。

b3を3番目の位置から2番目の位置に移動するには、右にシフトする方法が必要です。これには、>>または/のようなものが必要です。提供されている演算子のうち、2番目または1番目のビット位置を設定するためにb3で使用できる演算子はありません。

if文と代入演算子を使えば=可能です。次に、次のような厄介なソリューションを書くことができます

char flip(char c)
{
  char f;
  f = (c & 1) << 3 + (c & 2) << 1;
  if (c & 4)
    f = f + 2;
  if (c & 8)
    f = f + 1;
  return f;
}

if ?同様の演算子を使用できる場合は、より醜いが短い1つのライナー。

char flip(char c)
{
  return (c & 1) << 3 + (c & 2) << 1 + ((c & 4) ? 2 : 0) + ((c & 8) ? 1 : 0);
}
于 2012-02-04T01:59:18.853 に答える