2010-07-06 50 views

Trả lời

36

Đó là Bitwise phủ. Điều này có nghĩa là nó thực hiện toán tử NOT nhị phân trên mỗi bit của một số. Ví dụ:

int x = 15; // Binary: 00000000 00000000 00000000 00001111 
int y = ~x; // Binary: 11111111 11111111 11111111 11110000 

Khi kết hợp với toán tử &, nó được sử dụng để xóa bit. Vì vậy, trong ví dụ của bạn có nghĩa là 3 bit cuối cùng của kết quả là var2+7 được đặt thành số không.

Như đã lưu ý trong các nhận xét, nó cũng được sử dụng để biểu thị destructors, nhưng đó không phải là trường hợp trong ví dụ của bạn.

+8

+1 Để có câu trả lời đúng. Chỉ muốn chỉ ra rằng '~' cũng được sử dụng để đặt tên cho destructors. – ereOn

+1

Và thường được sử dụng để tạo mặt nạ bit. –

+0

Cảm ơn bạn rất nhiều. Bạn đã dọn dẹp nó cho tôi. – Swiss

2

7 ở dạng nhị phân là 00000111, vì vậy ~ 7 là 11111000 (giả sử byte tám bit). Tác giả mã đang sử dụng nó để tạo mặt nạ bit.

+3

Nó có thể không được bitmasking - nó chỉ có thể làm tròn xuống 8 gần nhất (vì lý do nào đó). – corsiKa

+0

Đó không chỉ là giả định một byte tám bit, mà là một 'int' 1 byte, đó là một giả định sai cho bất kỳ tiêu chuẩn nào phù hợp với trình biên dịch C. – sepp2k

+2

Tôi cho rằng anh ta chỉ muốn tránh viết quá nhiều chữ số nhị phân và giải thích đồng thời bằng ví dụ thao tác không hoạt động. – ShinTakezou

3

Đó là một NOTwise bit. Không được nhầm lẫn với logic không (mà là!), Mà flips giá trị hợp lý (true đến false và ngược lại). Toán tử này lật từng bit trong một biến.

4

Mã này làm tròn lên var1 đến số n * 8 gần nhất. & ~ 7 đặt 3 bit cuối cùng thành 0, làm tròn xuống 8 * n.

1

Hiệu ứng của mã, như được lưu ý, là làm tròn giá trị cho bội số cao hơn tiếp theo của tám. Công thức ưu tiên của tôi sẽ là "var1 = (var2 | 7) +1;" nhưng để hiểu biểu thức như được viết, thì hữu ích nhất để hiểu nó từ bên ngoài.

Mặc dù "&" và "~" là các toán tử riêng biệt, với các quy tắc ưu tiên khác nhau, khái niệm "a = b & ~ c ; " là một trong những hữu ích mà trong một ý nghĩa rất thực sự xứng đáng điều hành riêng của mình (nó sẽ cho phép các quy tắc quảng bá số nguyên hợp lý hơn, trong số những thứ khác). Về cơ bản, "a = b & ~ c;" phục vụ để hủy bỏ bất kỳ bit trong 'b' mà cũng trong 'c' (nếu 'b' là dài và 'c' không phải là, vì quy tắc khuyến mãi số nguyên, nó hủy bỏ bit cao hơn của tôi là tốt). Nếu 'c' là 2^N-1, biểu thức sẽ hủy bỏ N bit dưới cùng, tương đương với làm tròn xuống bội số tiếp theo của 2^N.

Biểu thức như được viết thêm 7 đến var2 trước khi làm tròn kết quả xuống bội số tiếp theo 8. Nếu var2 là bội số của 8, việc thêm 7 sẽ không đạt được bội số tiếp theo cao hơn 8, nhưng ngược lại . Do đó, biểu thức tổng thể sẽ làm tròn lên bội số tiếp theo của 8.

Ngẫu nhiên, công thức ưa thích của tôi làm tròn số lên giá trị cao hơn kế tiếp chỉ là bội số của 8, và sau đó nhấn nó lên đến số tiếp theo. Nó tránh sự lặp lại của số ma thuật "7", và trong một số hướng dẫn đặt cách tiếp cận sẽ lưu mã.