2012-04-28 90 views
9

我有一個字符數組,我試圖按位右移>>,然後&與另一個數組。我想我對如何做到這一點有錯誤的想法。char的按位移數組

我想,即使它是個字符只是陳述my_array >>= 1的陣列將轉移的一切,但我得到了一個錯誤:"error: invalid operands to binary >> (have ‘char[8]’ and ‘int’)"

按位比較,我試圖做的是開始對所有類似大小的數組「0」...因爲我得到:"error: invalid operands to binary & (have ‘char *’ and ‘char *’)"

我需要將這些數組轉換成別的東西,然後才能轉移和比較嗎?

對不起,我不是很清楚......所有偉大的建議,直到現在,我認爲我越來越意識到,沒有超級簡單的方法來做到這一點。更具體地說,我想要做的是將WHOLE char數組的右側位移1,將右移後的位添加到數組的左側,並與另一個相同大小的數組進行按位比較。

從技術上說,比較並不一定要用數組排列......我只需要這些位。在嘗試進行移位/比較之前將數組轉換爲其他數據會更容易嗎?

+2

你想旋轉數組的內容,還是試圖按位移動數組中的每個單獨的元素?這兩種操作本身都不存在於C語言中。您需要編寫一個循環,將每個元素複製到一個位置,或者逐位移動數組中的每個元素。 – chrisaycock 2012-04-28 21:27:17

回答

10

你得換和按元素進行比較。

for(i = 0; i < len; ++i) 
    array[i] >>= 3; 

例如。如果要移動的位移出一個元素的下一個,它更復雜,說你右移,然後

unsigned char bits1 = 0, bits2 = 0; 
for(i = len-1; i >= 0; --i) { 
    bits2 = array[i] & 0x07; 
    array[i] >>= 3; 
    array[i] |= bits1 << 5; 
    bits1 = bits2; 
} 

遍歷其它方向的陣列,因爲你從未來需要的位更高的插槽。

2

您必須逐個移動數組中的條目。 (如果你想比較其中兩個,你需要逐個元素來完成它。)

如果你希望每個字符的位移動都會轉移到下一個字符,你需要也要手動照顧。

如果你想要轉入下一個字節的行爲,並且不介意讓你的代碼變得討厭,不便攜,並且容易出錯,那麼你可以把指針指向數組,到unsigned long long *之類的東西,取消引用它並移動生成的整數,然後再次存儲它。

但是,如果這是你想要的行爲,那麼你應該使用整數而不是char[8]開始。

(如果你能多談談你實際上旨在實現,那麼更多的有用的答案是可能的。)

2

如果你想在數組上執行諸如移位/ OR/XOR/AND/etc等操作,你應該在循環中執行它,你不能直接在數組上執行它。

2

您只能移動該數組的成員,一個char(或一個int)。你不能移動整個數組。移動my_array嘗試對不可能的數組類型(或指向char的指針)執行移位操作。而是執行此操作:

for (i = 0; i < size; i++) { 
    my_array[i] >>= 1; 
} 

你也必須小心地使用字符,因爲它們通常簽名,幷包含一個負值的字符會從左邊的零,而不是把「1」。所以你最好使用無符號的字符。

編輯: 上面的代碼是簡單的。如果您打算將整個陣列作爲一個整體進行右移,而不是單獨對每個字節進行右移,那麼您需要「手動」將每個LSB複製到其右側字節的MSB。在理查德彭寧頓的回答中循環。

+0

我假設他想將數組視爲單個值,所以您需要從更重要的字節中進行一點操作。 – loganfsmyth 2012-04-28 21:37:15

+0

對,我編輯了我的答案。謝謝 – 2012-04-28 21:55:42

3
/** Shift an array right. 
* @param ar The array to shift. 
* @param size The number of array elements. 
* @param shift The number of bits to shift. 
*/ 
void shift_right(unsigned char *ar, int size, int shift) 
{ 
    int carry = 0;        // Clear the initial carry bit. 
    while (shift--) {       // For each bit to shift ... 
     for (int i = size - 1; i >= 0; --i) { // For each element of the array from high to low ... 
      int next = (ar[i] & 1) ? 0x80 : 0; // ... if the low bit is set, set the carry bit. 
      ar[i] = carry | (ar[i] >> 1);  // Shift the element one bit left and addthe old carry. 
      carry = next;      // Remember the old carry for next time. 
     } 
    } 
} 
+0

這個看起來很奇怪,或者我錯過了一些東西。它看起來像是右移和左移的組合。進位位旁邊的註釋說「將元素左移一位」,但它右移。而for循環從高到低,我寧願從低到高轉向右側。 – 2015-07-28 11:44:08

+0

另外我會移動「int carry = 0;」在for循環之前的while循環中。 – 2015-07-28 12:06:14