對於給定的陣列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 ...