2011-11-02 92 views
21

thể trùng lặp:
What is the tilde (~) in a C# enumeration?Dấu ngã có ý nghĩa gì trong một biểu thức?

tôi thấy các bit mã sau đây trên một trang MSDN this.

(((Width * Planes * BitCount + 31) & ~31)/8) * abs(Height) 

Điều này thực sự biên dịch trong C# visual studio 2010. Chính xác thì dấu ngã "~" đang làm gì trước số 31? Tôi chưa bao giờ thấy cú pháp này trong một biểu thức trước đây.

+2

Bổ sung bitwise của nó. Xem liên kết dưới đây. [Làm thế nào Liệu các Bitwise Bổ sung Điều Hành Công việc] [1] [1]: http://stackoverflow.com/questions/791328/how-does-the-bitwise-complement-operator-work – Nerdtron

+0

Đối với ref tương lai đây là danh sách các toán tử C#. [Nhà điều hành C#] (http://msdn.microsoft.com/en-us/library/6a71f45d.aspx) –

Trả lời

5

Đây là bitwise complement operator.

Về cơ bản, nó chuyển đổi các bit:

0xffff0000 == ~0x0000ffff 

Trong đoạn code bạn đã đăng, làm & ~31 đảm bảo 5 bit cuối cùng là 0 (Bitwise và phần bù của 11111 là 00000).

36

~ - bitwise NOT operator, về cơ bản đảo ngược bit

31 ở định dạng nhị phân là 11111, vì vậy ~ 31 == 00000, về cơ bản 0

+0

+1 vì đây là câu trả lời dễ hiểu nhất và rõ ràng nhất. –

+5

Ví dụ không chính xác, bởi vì số 0 đứng đầu cũng bị đảo ngược. I E. '~ 31 = ~ 0x0000001F = 0xFFFFFFE0' – JimiLoe

+1

Ví dụ này không đúng Số nhị phân bổ sung của 31 là 00000000000000000000000000011111 (là 0000001F trong Hex - nếu 32 bit được tính toán) và toán tử" ~ "lật các bit, vì vậy câu trả lời sẽ là 11111111111111111111111111100000 , nếu chúng ta chuyển đổi số này sang thập phân, câu trả lời là -32 Nếu 64 bit, số nhị phân bổ sung của hai là 0000000000000000000000000000000000000000000000000000000000011111 và "~" lật các bit, tương đương với -32. AFAIK không có PC 6 bit nào chạy C# tại sao máy của bạn sai. Nếu có máy tính 6 bit, điều này là chính xác. –

1

Đây là toán tử Bitwise bổ sung - nó chỉ làm cho tất cả 0 bit vào 1s và ngược lại ... xem MSDN reference.

Trong trường hợp cụ thể của bạn nó chỉ tạo ra (31 = 0x1F):

~0x1F = 0xFFFFFFE0 

Nó được sử dụng với bitwise and (&) và do đó bascially nó hủy bỏ ra 5 bit cuối cùng.

0

~ 31 = Bitwise phủ ngày 31 và trong trường hợp đặc biệt này được sử dụng để giữ cho số không là người đầu tiên (từ LSB) 5 bit của (Width * Planes * BitCount + 31)

7

Bạn chuyển sang bản tiện dụng lại ISO/IEC 23270:2006 — Information technology — Programming languages — C# và chuyển sang § 14.6. 4 của thánh viết. Ở đó bạn sẽ tìm thấy:


14.6.4 Bitwise nhà điều hành bổ sung

Đối với hoạt động của các hình thức ~ x, điều hành unary độ phân giải quá tải (§14.2.3) được áp dụng để chọn một nhà điều hành cụ thể thực hiện. Toán hạng được chuyển đổi thành kiểu tham số của toán tử đã chọn và loại kết quả là kiểu trả về của toán tử. Các toán tử bổ sung bit được xác định trước là:

int operator ~(int x) ; 
uint operator ~(uint x) ; 
long operator ~(long x) ; 
ulong operator ~(ulong x) ; 

Đối với mỗi toán tử này, kết quả của phép toán là bổ sung bit của x.

Mỗi kiểu enumeration E ngầm cung cấp cho các nhà điều hành Bitwise bổ sung sau đây:

E operator ~(E x); 

Kết quả của việc đánh giá ~x, nơi x là một biểu hiện của một kiểu liệt kê E với một loại tiềm ẩn U, là chính xác giống như đánh giá unchecked((E)(~(U)x)). Toán tử này chỉ được xem xét bởi độ phân giải quá tải của toán tử đơn nhất khi kiểu toán hạng là kiểu enum E (§14.2.3).

Các hình thức được nâng lên (§14.2.7) của các toán tử bổ sung bitwise được xác định trước chưa được xác định ở trên cũng được xác định trước.


Trong trường hợp của bạn ~31 giống như ~ 0x0000001F. Khiếu nại bitwise của 0x0000001F0xFFFFFFE0. Tại sao họ không chỉ viết mặt nạ thực sự mà họ muốn vượt ra ngoài tôi.

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