基於陣列的位運算3 按bit位反轉陣列

2021-05-24 14:05:39 字數 1679 閱讀 8893

對於給定的陣列uchar a, 以及bit位長度(不是陣列本身長度), 如何實現陣列按位長度的反轉演算法, 效率一定要高哦

大多數人首先想到的是首尾測試每個bit是否為0,1(本部落格有關於如何測試,設定bit). 然後在交換bit位

這種演算法的複雜度為位長度, 有沒有辦法進一步減小複雜度, 哪怕是常數因子也行,

答案是有的, 請看下面詳細**描述, 基本思路是先構造乙個16 bit的整數反轉表

總體思想還是空間換時間, 畢竟沒有免費的午餐.

typedef unsigned char uchar;

typedef unsigned short ushort;

typedef unsigned int uint;

////wordreverse[i] is equal to the bit reverse of i (i < 2^16)

static ushort wordreverse[1 << 16];

1. 下面先給出8bit整數按bit位反轉實現

//reverse bit of a byte with binary representation

static uchar reversebyte(const uchar c)

2. 利用reversebyte函式構造 wordreverse

// init bit reversebyte of word table

void createwordreversetable()

;nbitsize = sizeof(wordreverse) / sizeof(wordreverse[0]);

for (i = 1; i < (1 << 8); i++)

bytereverse[i] = reversebyte((uchar)i);

for (i = 1; i < nbitsize; i++)

wordreverse[i] = bytereverse[i >> 8] | (bytereverse[i & 255] << 8);

}3. 實現反轉長度為byte的陣列, 也就是位長度為8整數倍的陣列

//reverse word array bitarray with number of bitleng

static void reversebytearray(uchar bitarray, const int byteleng)

if (ps == pe) else if ((uchar*)pe + 1 == (uchar*)ps)

}4. 反轉bitleng長度的陣列bitarray, 本問題的解決方案

static void reversebitarray(uchar bitarray, const int bitleng)

//bitleng補齊到8的倍數

reversebytearray(bitarray, (bitleng + 8 - bitremains) / 8);

//多反轉的bit, 陣列整體向低位址移位

shiftbittolow(bitarray, bitleng + 16, 8 - bitremains);   

}5. shiftbittolow函式主要幹什麼的, 如何實現的?, 請看下回博文分解

結論:  問題給出, 和普通演算法相比效能有多大的提公升? 我的回答是效能》4倍, 但需要構造

表和實現多個函式, 對於小陣列(幾百位元組以內)沒有必要採用此演算法.

基於陣列的位運算4 位陣列按bit位整體移動

對於memmove,memcpy等c語言記憶體操作函式你一定很熟悉吧,如果不知道,just go search 廢話少說直接進入話題.給你乙個函式 static void shiftbittolow uchar bitarray,const uint bitleng,uint leftbitshif...

python的按位運算

華電北風吹 天津大學認知科學與計算重點實驗室 最後修改日期 2015 8 6 python提供了豐富的位運算操作符,例如按位與,按位或,按位異或,左移位,右移位和取反操作,例子 如下 a,b 45,83 bin a bin b 0b101101 0b1010011 a b,bin a b 127,0...

按位與 的運算

是二進位制 與 運算,參加運算的兩個數的二進位制按位進行運算,運算的規律是 0 0 0 0 1 0 1 0 0 1 1 1 對於參加運算的數要換算為二進位制進行運算,例如7 2的結果是2,過程如下 7 2 0111 0010 0010 2即 按位與運算,兩個當且僅當都為1的時候結果才為1,即1 1 ...