2014-06-08 63 views
5

Tôi có một số mã C# thực hiện một số hoạt động bitwise trên một byte. Tôi đang cố gắng làm điều tương tự ở golang nhưng đang gặp khó khăn.Thao tác bitwise Golang cũng như thao tác byte chung

Ví dụ trong C#

byte a, c; 
byte[] data; 
int j; 
c = data[j]; 
c = (byte)(c + j); 
c ^= a; 
c ^= 0xFF; 
c += 0x48; 

Tôi đã đọc rằng golang không thể thực hiện các hoạt động Bitwise vào loại byte. Vì vậy, tôi sẽ phải sửa đổi mã của tôi thành một loại uint8 để thực hiện các hoạt động này? Nếu vậy thì có một cách sạch sẽ và chính xác/tiêu chuẩn để thực hiện điều này?

Trả lời

11

Chắc chắn có thể thực hiện các thao tác bitwise trên loại byte, chỉ đơn giản là bí danh của uint8. Những thay đổi duy nhất mà tôi đã phải thực hiện mã của bạn là:

  1. Cú pháp của lệnh khai báo biến
  2. Chuyển đổi j-byte trước khi thêm nó vào c, vì Go thiếu (theo thiết kế) chuyển đổi xúc tiến số nguyên khi làm số học.
  3. Xóa dấu chấm phẩy.

Ở đây bạn đi

var a, c byte 
var data []byte 
var j int 
c = data[j] 
c = c + byte(j) 
c ^= a 
c ^= 0xFF 
c += 0x48 

Nếu bạn đang lập kế hoạch để làm Bitwise-không ở Gò, lưu ý rằng các nhà điều hành cho điều đó là ^, không phải là ~ được sử dụng trong hầu hết các ngôn ngữ lập trình hiện đại khác . Đây là toán tử tương tự được sử dụng cho xor, nhưng hai toán tử không rõ ràng, vì trình biên dịch có thể cho biết cái nào bằng cách xác định xem ^ được sử dụng như một toán tử đơn hoặc nhị phân hay không.

+0

Cảm ơn. Tôi đã giả định bởi vì tôi không thể thực hiện các phép toán bitwise trên một byte [] có độ dài 1 mà nó không thể thực hiện được và chỉ có thể thực hiện nó trên các int không dấu. – John

+0

@john Không có hoạt động bitwise trên lát, ngay cả khi chúng có chiều dài 1. Đây không phải là R hoặc MATLAB, nơi một vô hướng giống như một vectơ có độ dài 1. –