看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《bigpigbigpig (To littlepig with love)》之銘言: : 標題: Re: [問題] BitSwap : 時間: Wed Nov 16 13:13:15 2011 : : ※ 引述《kinding (de)》之銘言: : : 請寫一個char Bitswap(char a) function,也就是 : : bit0 <-> bit7 : : bit1 <-> bit6 : : bit2 <-> bit5 : : bit3 <-> bit4 ,舉例來說你輸入0x80 則輸出0x01 : : 我的想法是用一個char temp[8];每個元素存一個bit : : 所以將原本的char轉成二進位並存入temp : : 然後用reverse,最後再將陣列的元素轉成數值 : : 但是這樣的想法感覺很沒有效率,或許查表可以比較快 : : 但是這樣一來要建立255個轉換,有人有高見嗎? : : 0001 | 1000 = 24 : 0010 | 0100 = 36 : 0100 | 0010 = 66 : 1000 | 0001 = 129 : ... 中間舊Matlab程式省略 ... : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 61.61.252.34 : ※ 編輯: bigpigbigpig 來自: 61.61.252.34 (11/16 13:15) : 推 LPH66:bitxor 連 00 也會變 11 吧... 11/16 13:50 : : 謝謝指正,已修改 :) : ※ 編輯: bigpigbigpig 來自: 61.61.252.34 (11/16 14:31) : ※ 編輯: bigpigbigpig 來自: 61.61.252.34 (11/16 14:31) : : 上述方法太複雜了,為保留當初使用 mask 的用意,特貼另一較簡明的版本: : : function b = bitswap_2(a) : a = uint8(a); : m = uint8([ 24 36 66 129 ]); : c = bitand(a,m); : b = 0; : for i = 1:4 : b = b + swap_2_bit(c(i),m(i)); : end : end : : function b = swap_2_bit(a,mask) : if ( a == 0 || a == mask ) : b = a; : else : b = bitxor(a,mask); : end : end : ※ 編輯: bigpigbigpig 來自: 61.61.252.34 (11/16 15:44) : → xatier:可以將這個 code 翻譯成 C/C++ 嗎? 想研究看看,感謝! 11/16 17:01 手癢~我來滿足xatier的需求, 第一次翻譯Matlab到C/C++... 直接翻譯的版本, 沒有添加太多修飾! 供想研究的人參考! ------------------------------------------------------------------------------- #include <iostream> using namespace std; unsigned char swap_2_bit(unsigned char a, unsigned char mask) { unsigned char b; if (a == 0 || a == mask) b = a; else b = a ^ mask; return b; } unsigned char bitswap_2(unsigned char _a) { unsigned char a[4] = {_a, _a, _a, _a}; unsigned char m[4] = {24, 36, 66, 129}; unsigned char c[4] = {a[0] & m[0], a[1] & m[1], a[2] & m[2], a[3] & m[3]}; unsigned char b = 0; for (int i = 0; i < 4; i++) b += swap_2_bit(c[i], m[i]); // 唯一有修飾就這裡, index i 從 0 -> 3, 原先Matlab是1 -> 4, // 變成要寫成: /* for (int i = 1; i <= 4; i++) b += swap_2_bit(c[i - 1], m[i - 1]); */ return b; } int main(int argc, char* argv[]) { unsigned char c = 0x12; cout << hex << showbase << (unsigned int)c; cout << " -> (bitswap_2) -> "; cout << hex << showbase << (unsigned int)bitswap_2(c); cout << endl; return 0; } ------------------------------------------------------------------------------- 執行結果: C:\>bit_swap.exe 0x12 -> (bitswap_2) -> 0x48 IDE(Compiler) Dev-C++ v5.0.0.7 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.204.223.138
xatier:感謝您!<(__ __)> 11/17 02:42
bigpigbigpig:謝謝您 :D 11/17 08:29
tomnelson:P.S.我從來沒寫過Matlab程式,不過看來不難懂. 11/17 23:12