2011-06-28 36 views
12

[cách sử dụng toán tử ~]cách sử dụng nghịch đảo trong C

Tôi có cấu trúc là Alpha. Tôi biết giá trị của phần tử bên trong Alpha (giả sử a) có thể là 0 hoặc 1 - Tôi muốn phần tử khác có cùng cấu trúc để lấy giá trị nghịch đảo của Alpha.a. Ví dụ:

if Alpha.a = 1 
then Alpha.b = 0 

và ngược lại

Tôi đã thử:

Alpha.b = ~ (Alpha.a) 

Nhưng tiếc là nó không làm việc - khi Alpha.a1, Alpha.b được thiết lập để 254

Bất kỳ ý tưởng ?

Trân trọng cảm ơn,

SamPrat

+6

** Tại sao nó không hoạt động? Điều gì sẽ xảy ra? ** – SLaks

+0

nó cho thấy giá trị 254 – samprat

+2

HI guys, tôi đang háo hức muốn biết tại sao câu hỏi của tôi là xuống bình chọn để từ lần sau tôi sẽ rem sai lầm của tôi? – samprat

Trả lời

22

Sử dụng XOR điều hành:

Alpha.b = Alpha.a^1; 
+0

hoạt động hoàn hảo – samprat

+0

Cảm ơn bạn rất nhiều đã giúp đỡ nhanh chóng – samprat

0

Bạn muốn sử dụng điều hành khác. Đặc biệt !

Alpha.b = !Alpha.a 

Vì các giá trị bằng 0 hoặc 0, nên đơn giản hơn nhiều.

+0

cũng đã thử điều đó. nó không hoạt động – samprat

+8

** Tại sao không? Điều gì sẽ xảy ra? ** – SLaks

3

Toán tử ~ phủ nhận từng bit riêng lẻ. Ví dụ: giả sử rằng Alpha.aunsigned char. Sau đó, ~1 sẽ đọc, theo dạng nhị phân dưới dạng ~ 00000001 và kết quả sẽ là 11111110 (một lần nữa, trong nhị phân), tương tự như 254 trong thập phân và 0xFE trong hex.

Như những người khác đã đề xuất, hãy sử dụng !Alpha.a hoặc Alpha.a^1.

29

Trong C, true được biểu thị bằng 1 và false bằng 0. Tuy nhiên, trong so sánh, bất kỳ giá trị không giả nào đều được xử lý là đúng sự thật.

Nhà điều hành ! không boolean đảo ngược, như vậy! 0 là 1 và! 1 là 0.

Nhà điều hành ~, tuy nhiên, không Bitwise đảo, nơi mà mỗi bit trong giá trị của nó được thay thế bằng nghịch đảo. Vì vậy, ~ 0 là 0xffffffff (-1). ~ 1 là 0xfffffffe (-2). (Và cả hai -1 và -2 đều được coi là đúng, có lẽ điều gì khiến bạn bối rối.)

Điều bạn muốn là !, thay vì ~.

0

Bạn không thể sử dụng ~ vì điều này sẽ biến 00000000 thành 11111111 thay vì 00000001 như tôi nghĩ bạn đang mong đợi.

Nếu bạn có bools bạn có thể sử dụng:

Alpha.b = !(Alpha.a) 

nhưng nếu không bạn có thể phải sử dụng nếu/logic khác:

if (Alpha.a == 0) 
{ 
    Alpha.b = 1; 
} 
else 
{ 
    Alpha.b = 0; 
} 
+0

Tôi đang cố gắng xây dựng thư nên nếu người khác không được sử dụng lại ở giai đoạn này của mã của tôi – samprat

1

Một giải pháp đa nền tảng ngôn ngữ chéo tốt đẹp để phổ biến này vấn đề là:

Alpha.b = 1 - Alpha.a; 
0

Điều gì về bitmask hậu phẫu?

sử dụng ký tự unsigned tìm kiếm bit0:

b = 0x01u & (~a); 

hoặc thậm chí

b = a^0x01u; 

hoặc cho "Boolean-nhà tư tưởng" (xin lưu ý TRUE và FALSE có thể khác nhau từ 0/1 nếu bạn muốn! nó "boolean thực", bạn nên sử dụng TRUE và FALSE nếu được xác định.)

b = (1 != a)?(0u):(1u); 

Chúc mừng

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