Nếu tôi có các mảng:là gì cách nhanh nhất để làm một sự thay đổi chút tròn ngay trên một mảng byte
{01101111,11110000,00001111} // {111, 240, 15}
Kết quả cho một sự thay đổi 1 chút là:
{10110111,11111000,00000111} // {183, 248, 7}
Kích thước mảng không cố định và việc dịch chuyển sẽ từ 1 đến 7. Hiện tại tôi có mã sau (hoạt động tốt):
private static void shiftBitsRight(byte[] bytes, final int rightShifts) {
assert rightShifts >= 1 && rightShifts <= 7;
final int leftShifts = 8 - rightShifts;
byte previousByte = bytes[0]; // keep the byte before modification
bytes[0] = (byte) (((bytes[0] & 0xff) >> rightShifts) | ((bytes[bytes.length - 1] & 0xff) << leftShifts));
for (int i = 1; i < bytes.length; i++) {
byte tmp = bytes[i];
bytes[i] = (byte) (((bytes[i] & 0xff) >> rightShifts) | ((previousByte & 0xff) << leftShifts));
previousByte = tmp;
}
}
Có cách nào nhanh hơn để đạt được điều này hơn cách tiếp cận hiện tại của tôi không?
Tôi nghĩ rằng việc nhóm vào 'lâu dài đầu tiên sẽ có lợi cho hiệu suất. –
Nếu điều này là dành cho đồ họa, một tùy chọn khác để suy nghĩ là sử dụng định dạng được mã hóa theo thời lượng. Sau đó, chuyển dịch sẽ không phải thay đổi tất cả độ dài chạy ở giữa dòng. – BitBank
'long' có thể cải thiện hiệu suất, nhưng nó sẽ thay đổi từ máy này sang máy khác. (Đôi khi 'int' sẽ tốt hơn.) –