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
NOT(x)を出力するプログラムの作り方は?
例:
説明:
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
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;
}
最初の例は、負の数の2 の補数の2 進数表記のために、そのように機能します。
たとえば、値12
は実際に0000000000001100
は 16 ビット整数として表され、ほとんどの場合、実際には 32 ビット整数になります。この値のビットごとの否定は1111111111110011
であり、これは-13
2 の補数です。
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) = 3
and then NOT(3) =
0
.
したがって、必要なものを実装するには:
sd
は後述します。)2 ^ (sd) - 1
たとえば、次の番号を使用し12
ます。
4
( 2 ^ 4 = 16)1111111111110011
2 ^ 4 - 1 = 15
バイナリで0000000000001111
1111111111110011 AND 0000000000001111 == 0000000000000011
これはあなたが望んでいた結果です。ええと、int のすべてのビットを反転したい場合は、から値を減算するint max
か、短いものを反転してから減算することができshort max
ます...少なくとも、それがあなたが求めていることだと思います。