作者tomnelson (())
看板C_and_CPP
標題Re: [問題] BitSwap
時間Thu Nov 17 01:23:19 2011
※ 引述《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