2016-01-17 29 views
8

Tôi đang cố gắng tìm xem bit đầu tiên của x từ phải là 1, vì vậy tôi kiểm tra xem giá trị của x^11. Tuy nhiên,Sự khác biệt giữa if (x^1! = 1) và if (int (x^1)! = 1) trong C++?

int x=6; 
if (x^1!=1) 

cho câu trả lời sai, nhưng

if (int(x^1)!=1) 

cho câu trả lời đúng.

Tôi không chắc chắn lý do. Ai đó có thể làm rõ điều này cho tôi?

+3

Có tra cứu về quyền ưu tiên của toán tử. –

+3

Tại sao bạn sử dụng '^' (bitwise độc ​​quyền hoặc) thay vì '&' (bitwise và)? Bài kiểm tra này không hoàn toàn làm những gì bạn nghĩ. –

+2

Tra cứu những gì nhà điều hành đó làm, bạn muốn một chút và không XOR! –

Trả lời

13

Đó là một cái bẫy của operator precedence. Ưu tiên toán tử xác định cách hoạt động được "nhóm" (giống như cách 2*3+4 kết quả trong nhóm "2*3" được nhóm lại với nhau). Việc thêm dấu ngoặc đơn sẽ thay đổi cách mọi thứ được "nhóm" (ví dụ: 2*(3+4) làm cho số 3+4 được "nhóm" với nhau).

x^1!=1 tương đương với x^(1!=1), có thể được đơn giản hóa thành x^0.

int(x^1)!=1 tương đương với (x^1)!=1 (vì bạn đã thêm dấu ngoặc đơn theo cách thủ công ở đây; phần int không phù hợp lắm; đó là dấu ngoặc đơn quan trọng).

Như bạn có thể thấy, x^(1!=1)(x^1)!=1 không giống nhau.

Nếu mục tiêu của bạn là kiểm tra bit đầu tiên, tôi có thể đề xuất sử dụng bitwise AND (&). Sau đó, bạn có thể thực hiện if (x & 1) (nhưng hãy cẩn thận, trộn &== sẽ dẫn đến các vấn đề tương tự như trước đây, vì vậy hãy sử dụng dấu ngoặc đơn nếu bạn muốn viết if ((x & 1) == 1)).

0

Đơn giản,! = (Không phải là toán tử quan hệ bằng nhau) có độ ưu tiên cao hơn^(toán tử bitwise XOR). Check precedence

int x=6; 

trường hợp 1:if (x^1!=1)

Thứ nhất, 1!=1 is 0; sau đó 6^0= 6. (110^000 = 110); Check XOR table

Trường hợp 2:if (int (x^1)!=1)

Thứ nhất, x^1= 7; sau đó 7!=1 is 1 (đúng).

+0

Cảm ơn @Cornstalks bạn đã thông báo đúng và tôi đã sửa đổi nó. – Kulamani

0

@Cornstalks phù hợp với câu trả lời của anh ấy.

tôi chỉ có ý nghĩ đó (nó Does'nt trên thực tế trả lời vấn đề của bạn, nhưng có thể làm cho nó dễ đọc hơn):

cách tiếp cận khác để giải quyết vấn đề này chỉ đơn giản là sử dụng toán tử modulo:

if(x%2 == 0) // then first bit is 0 
else // first bit is 1 

Cuối cùng, nhiệm vụ của bạn chỉ đơn giản là kiểm tra các giá trị chẵn hoặc lẻ.

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