-5

NOT(x)を出力するプログラムの作り方は?

例:

  • 12対3
  • 0~1
  • 2対1

説明:

  • 1100~0011
  • 0~1
  • 01~10

    printf("%i\n%i\n%i\n", ~12, ~0, ~2);

版画:

-13
-1
-3

printf("%i\n%i\n%i\n", !12, !0, !2);

版画:

0
1
0
4

3 に答える 3

5

printf への可変引数は に昇格さintれます。最初にビットを変数 (int) に格納し、次にビットノットを実行すると考えてください。

int x = 12;     // 0x0000000C
int y = ~x;     // 0xFFFFFFF4 

y は負の符号付き int 値になりました。

フォーマット文字列と値を unsigned に変更すると、探しているものに近づく可能性があります。

int main(int argc, char *argv[])
{
    unsigned int x = 12;
    unsigned int y = ~x;
    printf("%u:%u\n",x,y);
    return EXIT_SUCCESS;
}

結果:

12:4294967283

値の実際の「ビットネス」を出力する機能を探している場合、printf() にはネイティブのビットバイナリ出力機能がないため、ここから出発点を見つけることができます。

最後に、フリッピングに関心があるのは先頭の最上位のゼロ以外のビットだけである場合は、入力値がゼロ (0) の場合に特別な条件を設定してください。これを正しく行うには、「このビット数は私にとって重要です」という値が本当に必要です。

編集: 非常に非効率的な BitString: 明らかに、これは リード テンプレート引数の数値型がないと機能しません。あなた自身の裁量で使用してください(そして危険です)。

template<typename T, size_t N=sizeof(T)*8>
std::string bit_string(T value, size_t maxbits=N)
{
    static const char *one = "1";
    static const char *zero = "0";
    std::string result;

    maxbits = std::min(maxbits, N);
    for (size_t i=0;i<maxbits;i++)
    {
        result = ((value & T(1)) ? one : zero) + result;
        value >>= 1;
    }
    return result;
}
于 2012-11-02T15:10:58.960 に答える
3

最初の例は、負の数の2 の補数の2 進数表記のために、そのように機能します。

たとえば、値12は実際に0000000000001100は 16 ビット整数として表され、ほとんどの場合、実際には 32 ビット整数になります。この値のビットごとの否定は1111111111110011であり、これは-132 の補数です。

2 番目のサンプル コードでは、boolean-not 演算子を使用しています。C++ はゼロ以外の値を真として扱い、「真でない」の値は常にfalse、または整数0です。同様に、!0は「偽でない」ことを意味-1し、C++ の「標準の真」の値として返されます。(この値が使用される!0 == -1のは、2 の補数であるため、および so!false~falseは同等の演算です。)

つまり、あなたがやろうとしていることは、あなたが思っているよりも複雑です。「NOT(x)」と呼ばれるものは、実際には「2 進数のビット単位の NOT であり、有効桁数の最小数に切り捨てられ、符号なしとして解釈されます」。それはあなたがそれを音にするほど簡単ではありません!

有効数字部分は特に重要です。すべての数値が8ビットの符号なしである場合、「NOT(2)」は実際にはそうでは253 ありません(あなたが必要としているように) 1

あなたの定義は、 NOT がもはや可逆的ではないことを意味することに注意することも興味深いです: NOT(NOT(12))is not12ですが、実際には would NOT(12) = 3and then NOT(3) =0.

したがって、必要なものを実装するには:

  1. 元の数の最上位桁を計算します (元の数よりも小さい 2 の累乗の最大値はどれですか?)。(この値sdは後述します。)
  2. 元の数値をビット単位で反転
  3. との結果のビット演算 AND2 ^ (sd) - 1

たとえば、次の番号を使用し12ます。

  1. 最上位桁は4( 2 ^ 4 = 16)
  2. 反転数 (16 ビットを想定) は1111111111110011
  3. 2 ^ 4 - 1 = 15バイナリで0000000000001111
  4. 1111111111110011 AND 0000000000001111 == 0000000000000011これはあなたが望んでいた結果です。
于 2012-11-02T15:12:48.980 に答える
0

ええと、int のすべてのビットを反転したい場合は、から値を減算するint maxか、短いものを反転してから減算することができshort maxます...少なくとも、それがあなたが求めていることだと思います。

于 2012-11-02T15:11:05.190 に答える