2016-04-27 21 views
0
#include <iostream> 
#include <string> 
#include <bitset> 

int main() 
{ 
    char c = 128; 
    unsigned int shift2 = (unsigned int)c; 
    std::string shift2bin = std::bitset<8>(shift2).to_string(); //to binary 
    std::cout << " shift2bin: " << shift2bin << std::endl; 

    unsigned int shift3 = shift2 >> 1; 
    std::string shift3bin = std::bitset<8>(shift3).to_string(); //to binary 
    std::cout << " shift3bin: " << shift3bin << std::endl; 

} 

出力で満たされている理由:unsigned int型の右シフトは常に '1'

shift2bin: 10000000 
shift3bin: 01000000 

質問>なぜ、unsigned int型の右シフトを:

shift2bin: 10000000 
shift3bin: 11000000 

次のように私は結果があることを期待しますフィラーとして1を使用しますか?

+1

システム上の 'char'が符号なし8ビット型で、これは普通ではないので、' c'に128を割り当てることはおそらくあなたが望むものではありません( "実装定義の振る舞い"と思います)。現在、 'shift2'の下位8ビットのみを表示しています。 'shift2'の残りの部分を出力して、何が起こっているのかをより深く理解してください。 –

+2

フィラーとして0を使用します。バイナリの 'shift2'は' 11111111111111111111111110000000'です。最後の8桁のみを出力しています。塗りつぶしの桁は重要ではありません。 –

+1

答えはもちろん、符号なし右シフトは1をフィラーとして使用しないということです。しかし、 'unsigned 'は8ビット以上である可能性が高いので、シフトされたフィラービットは見ていません。あなたは 'shift2'がビット9に1を持っているのを見ています。' c'は符号付きの型で負の値が割り当てられている可能性が高いです。 –

答えて

3

in this answerのように、符号なし右シフトは常にゼロフィルです。しかし、unsigned int内のすべてのビットをプリントアウトするためにこれを試してみてください。

std::string shift2bin = std::bitset<sizeof(shift2)*8>(shift2).to_string(); //to binary 
std::cout << " shift2bin: " << shift2bin << std::endl; 

次のようなものが表示されます(デフォルトでsigned char型持っているように見えると):あなたが同じことを行う場合

shift2bin: 11111111111111111111111110000000 
            ^^^^^^^^ 

shift3binのために、あなたが表示されます。

shift3bin: 01111111111111111111111111000000 
            ^^^^^^^^ 

だから、あなたはあなたが「1」の塗りつぶしを取得するように見えるかを見ることができます。

関連する問題