2010-04-09 94 views
18

Tôi có 1 bit trong một byte (luôn ở vị trí đặt hàng thấp nhất) mà tôi muốn đảo ngược. tức là trao 00000001 Tôi muốn để có được 00000000 và 00000000 Tôi muốn 00000001.Đảo ngược 1 bit trong C#

Tôi giải quyết nó như thế này:

bit > 0 ? 0 : 1; 

tôi tò mò để xem làm thế nào khác nó có thể được thực hiện.

Trả lời

39

Làm thế nào về:

bit ^= 1; 

này chỉ đơn giản XOR của bit đầu tiên với 1, mà Toggles nó.

Nếu bạn muốn lật chút sốN, đếm từ 0 ở bên phải phía 7 bên trái (đối với một byte), bạn có thể sử dụng biểu thức này:

bit ^= (1 << N); 

này sẽ không làm phiền bất kỳ khác bit, nhưng nếu giá trị được chỉ bao giờ sẽ là 0 hoặc 1 giá trị thập phân (tức là tất cả các bit khác là 0.), thì sau đây có thể được sử dụng cũng như:

bit = 1 - bit; 

Một lần nữa, nếu có chỉ là sẽ được đặt một bit, bạn có thể sử dụng cùng một giá trị cho 1 như trong bit đầu tiên để lật bit #N:

bit = (1 << N) - bit; 

Tất nhiên, tại thời điểm đó bạn không thực sự thực hiện thao tác bit theo cùng một nghĩa.

Biểu thức bạn có cũng tốt, nhưng lại thao tác toàn bộ giá trị.

Ngoài ra, nếu bạn đã bày tỏ một chút duy nhất như là một giá trị bool, bạn có thể làm điều này:

bit = !bit; 

nào Toggles giá trị.


Thêm một trò đùa: Tất nhiên, cách "enterprisey" sẽ được sử dụng một bảng tra cứu:

byte[] bitTranslations = new byte[256]; 
bitTranslations[0] = 1; 
bitTranslations[1] = 0; 

bit = bitTranslations[bit]; 
+0

này có lợi thế là không cần bit đầu tiên được lựa chọn đầu tiên, là tốt. –

+0

Lần đầu tiên tôi muốn sử dụng! nhưng sau đó phát hiện ra nó chỉ dành cho người ngu. Những thứ thú vị, làm việc ở cấp độ này. –

+0

Tôi sẽ đứng thứ hai đối số 'thể hiện nó như một bool' - tùy thuộc vào những gì bạn đang làm, có thể làm cho mã dễ đọc hơn một chút để người tiếp theo duy trì. – Paddy

4

Giải pháp của bạn là không đúng bởi vì nếu chút == 2 (10) sau đó nhiệm vụ của bạn sẽ mang lại bit == 0 (00).

Đây là những gì bạn muốn:

bit ^= 1; 
+0

Bạn nói đúng, nhưng tôi đã chuyển bit sang thứ tự thấp nhất vì vậy đây không phải là vấn đề đối với tôi –

+0

Nếu tất cả những gì bạn đang cố gắng làm là kiểm tra/thao tác một chút, bạn có thể loại bỏ sự dịch chuyển hoạt động và chỉ xor nó tại chỗ với một hằng số khác nhau (ví dụ nếu nó là bit thứ 7 quan trọng nhất bạn làm một cái gì đó giống như bit^= 0x40;) – par