2011-07-21 21 views
5

phép toán AND/KHÔNG từ VB.NET sang C# Original mã (VB.NET):Chuyển đổi

curStyle = curStyle And (Not ES_NUMBER) 

thay đổi Mã (C#):

curStyle = curStyle & (!ES_NUMBER); 

Nhưng nó đem lại cho tôi lỗi này:

Operator '!' cannot be applied to operand of type 'long'

ES_NUMBER có kiểu dữ liệu dài. Tôi đã thử thay đổi nó thành int, string, vv Tất cả đều không hoạt động.

Làm cách nào để giải quyết vấn đề này?

+0

Loại curStyle là gì? –

+0

Nhận phản xạ. Nó sẽ cho bạn thấy điều này và nhiều bản dịch khác. –

+0

'~' là toán tử bổ sung bitwise, nó sẽ lật từng bit trong toán hạng. –

Trả lời

8

And giống với &; bạn đã nhận được một cách chính xác. Not trước Long là toán tử NOT bitwise. Tương đương C# là ~.

Mã C# sẽ là:

curStyle = curStyle & (­~ES_NUMBER); 

Check-out Bitwise operators in c# OR(|), XOR(^), AND(&), NOT(~), giải thích C# nhà khai thác Bitwise.

+0

Có, nó hoạt động! yay !! Cảm ơn rất nhiều, anh bạn! :) –

+0

Bạn cũng có thể viết 'curStyle & = ~ ES_NUMBER;'. –

0

Một ký hiệu đơn và thường là thao tác bit, nhưng dấu chấm than là một phép toán logic. Bạn cần phải sử dụng two ampersands a la C++ nếu bạn muốn có một logic AND:

curStyle = curStyle && (!ES_NUMBER); 

Hoặc một dấu ngã nếu bạn muốn có một chút khôn ngoan VÀ:

curStyle = curStyle & (~ES_NUMBER); 
+0

Một ký hiệu đơn và không phải lúc nào cũng là một chút khôn ngoan và. Hãy xem xét (đúng & sai) là một logic và. –

+0

OP là * cố gắng * để thực hiện thao tác bit-khôn ngoan! – Gabe

+0

@Gabe: Vâng, tôi vừa tra cứu từ khóa 'And' và' Not' trong VB. Thú vị là họ làm việc ngầm. –

2

Một lần nữa, một chuyến đi đến các tài liệu chứng minh giảng dạy:

From MSDN:

The logical negation operator (!) ... is defined for bool and returns true if and only if its operand is false.

Không có gì trong tài liệu ở bất kỳ đâu về bất kỳ hành vi nào ở tất cả các biểu thức dạng số, mà tôi mong đợi có nghĩa là toán tử không được định nghĩa để làm việc với các biểu thức đó.

Mặt khác, MSDN has this to say about VB.NET's Not operator:

For numeric expressions, the Not operator inverts the bit values of any numeric expression and sets the corresponding bit in result according to the following table...

Vì vậy, câu hỏi là bây giờ: Làm thế nào để tạo lại hành vi của VB.NET của "Không" cho C#? Rất may, nó không khó: bạn có thể sử dụng ~ operator.

curStyle = curStyle & (­~ES_NUMBER); 

Và, chỉ cần cho các biện pháp tốt, documentation on &:

For integral types, & computes the bitwise AND of its operands.

0

Câu hỏi quan trọng là (và câu trả lời mà không được cung cấp): Là curStyle một số nguyên hoặc một bool? Bạn đang cố gắng để có được một giá trị thật (bool, true/false), hoặc là bạn đang cố gắng để che giấu các bit trong một lĩnh vực bit?

Đối với trường hợp thứ nhất, nơi curStyle là một bool (thật giá trị), bạn nói:

curStyle = curStyle && !ES_NUMBER ; 

Các trường hợp sau, nơi curStyle là một kiểu số nguyên và bạn muốn thao tác bit của nó, mất:

curStyle = curStyle & ~Not ES_NUMBER ; 
+0

ES_NUMBER dài. Do đó (Không phải ES_NUMBER) là một thời gian dài. Điều đó có nghĩa là curStyle phải dài nếu sử dụng kiểm tra loại nghiêm ngặt. –