2009-04-10 35 views
15

Có ai giải thích tại sao những thứ sau không biên dịch?Chuyển bit lệch 255 (dưới dạng byte)

byte b = 255 << 1 

Lỗi:

Constant value '510' cannot be converted to a 'byte'

Tôi đang mong đợi những điều sau trong hệ nhị phân:

1111 1110 

Việc chuyển đổi loại đã bối rối tôi.

Trả lời

35

Chữ số trong C# là int, không phải byte (và thay đổi bit sẽ được trình biên dịch đánh giá, do đó chỉ còn lại 510). Do đó, bạn đang cố gán giá trị cho một số byte không phù hợp. Bạn có thể che mặt bằng 255:

byte b = (255 << 1) & 0xFF 

để giảm kết quả thành 8 bit một lần nữa. Không giống như Java, C# không cho phép tràn đi bằng cách không bị phát hiện. Về cơ bản bạn có hai lựa chọn hợp lý khi cố gắng gán 510 cho một byte: Hoặc là kẹp ở giá trị lớn nhất, sau đó bạn nhận 255, hoặc vứt bỏ các bit không vừa, trong trường hợp này bạn sẽ nhận được 254.

bạn cũng có thể sử dụng unchecked, như lassevk mentioned:

byte b = unchecked((byte)(255 << 1)); 
+0

Không chắc chắn lý do tại sao tôi nghĩ 255 sẽ được lưu trữ dưới dạng 8 bit –

+0

Vâng, 255 phù hợp, mọi thứ ở trên đều không :) – Joey

+4

Cần lưu ý, vì tôi đã được đẩy ở đây từ một chuỗi khác, ngay cả khi bạn có hai byte, bất kỳ hoạt động bitwise trên chúng sẽ trả về một int. –

1
255 << 1 

sẽ cung cấp cho bạn nhiều hơn một byte.

1

bạn đã thử truyền chưa?

byte b = (byte)(255 << 1) 

Đây là một cách tiếp cận thú vị - các mã trên sẽ có tác dụng nếu được bọc trong một khối unchecked như thế này:

unchecked 
{ 
    byte b = (byte)(255 << 1); 
} 

Vì nó là unchecked giá trị sẽ bỏ bớt phần giá trị dự kiến ​​của 254. Vì vậy, nó có thể làm điều này với một diễn viên!

+0

-1 Bạn không thể cast, nó thậm chí sẽ không biên dịch. –

+0

Có thể bạn muốn nói (byte) (255 << 1)? – finnw

+1

thử: byte b = (255 << 1) & 0xff; – Joel

8

Bạn đang chuyển 255 x 1 bit, sau đó cố gán nó cho một byte. 255 << 1 is 510 và 510 sẽ không vừa với byte.

5
byte b = 0xff & (255 << 1); 
5

kết quả của các nhà điều hành << là một Int32, không phải những gì bạn đưa vào nó.

Bạn cần truyền kết quả của ca làm việc, chứ không phải đầu vào. Ngoài ra, nó sẽ tạo ra một tràn (nó là lớn hơn một byte afterall), vì vậy bạn cần phải xác định rằng bạn cần một diễn viên không được kiểm soát.

Nói cách khác, điều này sẽ làm việc:

Byte b = unchecked((Byte)(255 << 1)); 
0

Và kể từ < < có một ưu tiên cao hơn & bạn có thể lưu dấu ngoặc:

byte b = 255 << 1 & 0xff; 
Các vấn đề liên quan