2015-03-06 15 views
6

Tôi hiện đang học cho kỳ thi C++. Một trong những câu hỏi trong bài kiểm tra thực tế là:Tại sao chuyển bit này lại thành 51

Đầu ra của tuyên bố này là gì.

cout <<(11>>1)<<1<<endl; 

Như tôi thấy. 11 tổ chức tương đương nhị phân của

1011. 

Chuyển số nhị phân này với 1 chút sang bên phải làm cho nó:

0101 

Sau đó chuyển RẰNG số một sang trái làm cho nó

1010 

Mà đánh giá đến 10.

Tuy nhiên, bằng cách chạy cùng một tuyên bố trong trình biên dịch của tôi, nó nói t anh ta đánh giá số 51. Ai đó có thể giải thích điều này cho tôi không?

+6

Bạn hãy thử 'cout <<((11>> 1) << 1) << endl; '? –

+4

Nó không phải là 51, đó là một 5 theo sau là một 1. – jpw

+1

Cảm ơn tất cả mọi người! Tôi thấy nó khá thất vọng khi mọi người sẽ downvote câu hỏi này. Tôi chỉ muốn học –

Trả lời

13

Điều này là do quá tải toán tử.

cout <<(11>>1)<<1<<endl; 
// ^output operator 
//  ^right shift 
//   ^output operator 

Nếu bạn đã thay đổi mã này, sau đó câu trả lời của bạn sẽ là chính xác:

cout << ((11>>1) << 1) <<endl; 
// brackets force left shift operator instead of output 
4
int a = (11>>1); 
int b = 1; 
cout << a << b; 

Xóa?

+0

Được bình chọn cho câu châm biếm! – CinCout

6

cout << (11>>1) << 1 << endl;

trở thành

cout << 5 << 1 <<endl;

Các luồng ý nghĩa của << được ưu tiên hơn ý nghĩa chuyển. Do đó, nó in số 5 theo sau là 1.

+0

"Ý nghĩa trực tuyến của' << 'được ưu tiên hơn ý nghĩa dịch chuyển." Nó thực sự là kết quả của [liên kết cú pháp của 'toán tử <<'] (http://en.cppreference.com/w/cpp/language/operator_precedence). Nếu bạn thay đổi 'cout' thành một đối tượng số, bạn vẫn sẽ kết thúc với một cái gì đó như' 7 << (11>> 1) << 1 == (7 << (11>> 1)) << 1; ' –

Các vấn đề liên quan