अगर मैं सरणी है:क्या एक बाइट सरणी पर एक सही परिपत्र सा बदलाव करने के लिए सबसे तेज़ तरीका है
{01101111,11110000,00001111} // {111, 240, 15}
एक 1 बिट बदलाव के लिए परिणाम है:
{10110111,11111000,00000111} // {183, 248, 7}
सरणी आकार तय नहीं है, और स्थानांतरण 1 से 7 समावेशी होगा। वर्तमान में मेरे पास निम्न कोड है (जो ठीक काम करता है):
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;
}
}
क्या मेरे वर्तमान दृष्टिकोण से इसे हासिल करने का कोई तेज़ तरीका है?
मुझे लगता है कि 'लम्बे पहले' में समूहांकन प्रदर्शन के लिए फायदेमंद होगा। –
यदि यह ग्राफिक्स के लिए है, तो इसके बारे में सोचने का एक और विकल्प रन-लम्बा एन्कोडेड प्रारूप का उपयोग करना है। फिर स्थानांतरित करने के लिए लाइन के बीच में सभी रन लम्बाई बदलनी पड़ेगी। – BitBank
'लंबा' प्रदर्शन में सुधार कर सकता है, लेकिन यह मशीन से मशीन में भिन्न होगा। (कभी-कभी 'int' बेहतर होगा।) –