1

int 変数を任意の長さの 2 つの部分に分割しようとしています (つまり、32 ビットを 31 と 1 ビット、30 と 2 ビット、16 と 16 ビット、1 と 31 ビットなどに分割します)。

ビットごとのシフト演算子を使用して実装しようとしましたが、正しく機能しないようです。

int botLength = 4;
int start = ~0;
int top = start << botLength;
int bottom = start - top;

std::cout << "Top:    " << std::bitset<32>(top) << std::endl;
std::cout << "Bottom: " << std::bitset<32>(bottom) << std::endl;

これは出力します

Top:    11111111111111111111111111110000
Bottom: 00000000000000000000000000001111

私が望むところ:

Top:    00001111111111111111111111111111
Bottom: 00000000000000000000000000001111    

コードを次のように変更することでこれを修正できると思いました。

int botLength = 4;
int start = ~0;
int top = start << botLength;
int bottom = start - top;
top = top >> botLength; //added this

std::cout << "Top:    " << std::bitset<32>(top) << std::endl;
std::cout << "Bottom: " << std::bitset<32>(bottom) << std::endl;

ただし、これを出力すると、パディングとして 1 が追加されるようです。

Top:    11111111111111111111111111111111
Bottom: 00000000000000000000000000001111

誰でもこれを修正する方法を提案できますか?

4

3 に答える 3

2

C および C++ ではint符号付き数値として扱われるため、右シフト演算子は符号を示す最上位ビットをコピーします。符号付き数値は2 の補数でエンコードされます。

unsigned右にシフトするときに最上位ビットをクリアするには、に切り替える必要があります。または、その場でキャストを使用することもできます。次に例を示します。

unsigned bits = 1;
int s = -1;
s = s >> bits;

int u = -1;
u = unsigned(u) >> bits;

この後、s は -1 (0xFFFFFFFF) になり、u は 2147483647 (0x7FFFFFFF) になります。

于 2013-11-04T19:20:22.100 に答える