2012-10-24 24 views
6

Tôi đã cố gắng hiểu cách điều kiện hoạt động với các toán tử bitwise. Một cách để kiểm tra xem một số là chẵn hoặc lẻ có thể được thực hiện bằng cách:Báo cáo điều kiện hoạt động như thế nào với các nhà khai thác bit-khôn ngoan?

#include <iostream> 
#include <string> 
using namespace std; 

string test() 
{ 
    int i = 8; //a number 
    if(i & 1) 
     return "odd"; 

    else 
     return "even";  
} 

int main() 
{ 
    cout << test(); 
    return 0; 
} 

Các Phần I không hiểu là như thế nào nếu việc điều kiện. Trong trường hợp này nếu i = 8 thì câu lệnh If trong đó đang thực hiện 1000 & 1 sẽ trả lại 1000 bằng 8.

Nếu i = 7, thì nếu cần thì hãy làm 111 & 1 cho số 111 bằng 7

Tại sao trường hợp nếu (8) trả về "ngay cả" và nếu (7) trả về "lẻ"? Tôi đoán tôi muốn hiểu những gì nếu tuyên bố được kiểm tra là đúng và những gì là sai khi đối phó với các nhà khai thác bit-khôn ngoan.

Just A nghĩ khi tôi viết câu hỏi này xuống là nó bởi vì nó thực sự làm

for 8: 1000 & 0001 which gives 0 
for 7: 0111 & 0001 which gives 1? 
+6

Giả định của bạn về những gì 'x & y' trả lại là sai. – chris

+0

"tuyên bố nếu điều gì đang kiểm tra là đúng và những gì là sai khi đối phó với các nhà khai thác bit-khôn ngoan." - kiểm tra tình trạng chỉ quan tâm đến kết quả cuối cùng, không bao giờ về cách tính toán. –

+0

& là bitwise và. 1000 là 1111101000, trong khi 1 là 1. 1111101000 & 1 là 0, do đó, nó là sai. – Cubic

Trả lời

13

Vâng, bạn là đúng trong phần cuối cùng. Nhị phân &| được thực hiện từng chút một. Kể từ

1 & 1 == 1 
1 & 0 == 0 
0 & 1 == 0 
0 & 0 == 0 

chúng ta có thể thấy rằng:

8 & 1 == 1000 & 0001 == 0000 

7 & 1 == 0111 & 0001 == 0001 

chức năng test của bạn không tính toán một cách chính xác cho dù một số là chẵn hoặc lẻ tuy nhiên, vì a & 1 kiểm tra liệu có một 1 ở vị trí số 1, chỉ có số lẻ.

+1

không có gì để nói ở đây :) Có thể thêm rằng 1 & 0 = 0, 1 & 1 = 1 và 0 & 1 = 0 – count0

2

Biểu thức i & 1, trong đó iint, có loại int. Giá trị của nó là 1 hoặc 0, tùy thuộc vào giá trị của bit thấp của i. Trong tuyên bố if(i & 1), kết quả của biểu thức đó được chuyển đổi thành bool, theo quy tắc thông thường cho các loại số nguyên: 0 trở thành false và khác không trở thành true.

2

Điều bạn nói mã đang làm thực sự là cách các nhà khai thác bit được cho là hoạt động. Trong ví dụ bạn (8 & 1):

1000 & 0001 = 0000 

bởi vì trong giá trị đầu tiên, các bit cuối cùng được đặt thành 0, trong khi ở giá trị thứ hai, các bit cuối cùng được thiết lập để 1. 0 & 1 = 0 .

0111 & 0001 = 0001 

trong cả hai giá trị, các bit cuối cùng được thiết lập để 1, vì vậy kết quả là 1 từ 1 & 1 = 1.

2

if(x) trong C++ chuyển đổi x để boolean. Số nguyên được coi là true iff không phải là số không.

Vì vậy, tất cả if(i & 1) đang làm là kiểm tra xem bit ít quan trọng nhất có được đặt trong i hay không.Nếu được đặt, i&1 sẽ không đồng bộ; nếu không được đặt, i&1 sẽ bằng không.

Bit ít quan trọng nhất được đặt trong số nguyên iff là số nguyên là số lẻ, do đó, i&1 là nonzero iff i là số lẻ.

+1

Đây là C++ mặc dù. 'true' là true và' false' là false, chỉ là các số nguyên và con trỏ vẫn được chuyển đổi hoàn toàn thành 'bool'. – Cubic

+0

@Cubic: vâng, đúng, tôi bằng cách nào đó đã bỏ lỡ điều đó. đã sửa. – nneonneo

4

Thực ra, trong C, C++ và các ngôn ngữ lập trình chính khác, toán tử & thực hiện hoạt động AND trong mỗi bit đối với các loại tích phân. Bit thứ n trong một Bitwise AND bằng 1 khi và chỉ khi các bit thứ n của cả hai toán hạng đều bình đẳng để 1.

Ví dụ:

8 & 1 = 
1000 - 8 
0001 - 1 
---- 
0000 - 0 

7 & 1 = 
0111 - 7 
0001 - 1 
---- 
0001 - 1 

7 & 5 = 
0111 - 7 
0101 - 5 
---- 
0101 - 5 

Vì lý do này làm một Bitwise AND giữa một thậm chí số và 1 sẽ luôn bằng 0 vì chỉ các số lẻ có bit ít quan trọng nhất bằng 1.

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