banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

使用递归位运算实现对字节的中心转置反转

字节の中心反転を再帰的なビット演算を使用して実現する
これは IBM の技術面接の問題であり、参考に供されるものである
元の問題は以下の通りである
任意のバイト長のデータ(1 バイトを例にする)が与えられた場合、データのビットの中心を反転させることを要求する
つまり、データの対称ビットのデータ交換である。例えば:
1010 1100 -> 0011 0101
1111 1111 -> 1111 1111
0000 0000 -> 0000 0000
1111 0000 -> 0000 1111
解決策は非常に簡単で、以下のビット変換を実装するだけでよいが、他のビットの状況を考慮する必要がある
演算子の使用に注意する必要がある。IBM は IBM だけある

11 -> 11
00 -> 00
10 -> 01
01 -> 10

以下は C 言語と VB.net 言語の 2 つの解決策の実装コードである。VB はビット変換に関与しており、効率は低いが、アルゴリズムは同じである。また、ここでは再帰アルゴリズムを使用している。

VB.net

'グローバル変数、変換するデータを保存する
Private val As Byte

''' ''' コアアルゴリズム、再帰を使用してバイトの中心を反転させる
''' 
''' 
''' 
Private Sub fun(ByVal a As Byte)
    If a = 0 Then
        Exit Sub
    End If
    '11 -> 11
    '00 -> 00
    '10 -> 01
    '01 -> 10
    'アルゴリズムは11と00の場合を除外し、01と10を反転させることにある
    'andの後にすべて0の場合を除外する
    If (val And a) <> (CByte(128 / a) And val) Then
        'どちらかが0であれば、もう一方は必ず1である。全て1の場合は自然に除外される
        If (val And a) = 0 Or (CByte(128 / a) And val) = 0 Then
            'ビット演算を実行する
            val = CByte(val Xor (a + CByte(128 / a)))
        End If
    End If
    '再帰呼び出し
    fun(a / 2)
End Sub

C/C++

//C 言語でバイトの中心を反転させる
#include #include #define BYTE 8
//#define INTEGER 16

#define LENGTH BYTE
//#define LENGTH INTEGER

// 演算子を求めるためのパラメータの取得
#define ARGUMENT pow(2 , (LENGTH / 2 - 1))
//#define ARGUMENT 1 << ( LENGTH/2 -1 )

#define HIGHT 0x80 /*1000 0000*/
//#define HIGHT 0x8000 /*1000 0000 0000 0000*/

unsigned short val = 0;
//unsigned int val = 0;

int fun(int a){
//a が空の場合、戻る
if (0 == a) {
return 0;
}
//'11 -> 11
//'00 -> 00
//'10 -> 01
//'01 -> 10
//' アルゴリズムは 11 と 00 の場合を除外し、01 と 10 を反転させることにある
//'and の後にすべて 0 の場合を除外する
if ( (val & a) != ((HIGHT / a) & val) ){
// どちらかが 0 であれば、もう一方は必ず 1 である。全て 1 の場合は自然に除外される
if ( 0 == (val & a) || 0 == ((HIGHT / a) & val) ) {
// ビット演算を実行する
val = val ^ ((HIGHT / a) + a);
}
}
fun(a / 2);
//func(a >> 1);
return 1;
}

int main(int argc , char * args[]) {
// 入力
scanf("%d", &val);
// 再帰呼び出し
fun(ARGUMENT);
// 出力
printf("%d", val);
return 0;
}

完全なコードのダウンロード
http://www.lidaren.com/code/bytecvt/src.zip
VB の実行結果

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。