input
を意味している、私はchar配列char input[8] = "abcdabcd"
を持っている、と私は対角線でそれを反転ビット単位にしたい:C/C++やCudaでは、char配列を斜めにビット単位で効果的に反転する方法はありますか?
input[0] == 'a': 0 1 1 0 0 0 0 1
input[1] == 'b': 0 1 1 0 0 0 1 0
input[2] == 'c': 0 1 1 0 0 0 1 1
input[3] == 'd': 0 1 1 0 0 1 0 0
input[4] == 'a': 0 1 1 0 0 0 0 1
input[5] == 'b': 0 1 1 0 0 0 1 0
input[6] == 'c': 0 1 1 0 0 0 1 1
input[7] == 'd': 0 1 1 0 0 1 0 0
output
:
a b c d a b c d
output[0] == 0 : 0 0 0 0 0 0 0 0
output[1] == 255 : 1 1 1 1 1 1 1 1
output[2] == 255 : 1 1 1 1 1 1 1 1
output[3] == 0 : 0 0 0 0 0 0 0 0
output[4] == 0 : 0 0 0 0 0 0 0 0
output[5] == 17 : 0 0 0 1 0 0 0 1
output[6] == 102 : 0 1 1 0 0 1 1 0
output[7] == 170 : 1 0 1 0 1 0 1 0
我々は2つのループを使用できることは明らかですビット単位の操作やターゲットビットを1つずつ設定する操作と組み合わされていますが、これは少なくとも64 * n
の操作が必要であることを意味します。
入力と出力は異なる方向(行単位または列単位)でメモリを読み取ることにすぎないので、それ以上の効果がありますか?
また、特別なメモリレイアウトに基づいてこの操作を行うことや、配列の数や文字を変更することは、かなり受け入れられ、意味があると思います。
ありがとうございます!
おそらくあなたが探しているのは*マトリックス転位*です。あなたはそれのためのGoogleのアルゴリズムをすることができます、それはMatrix Theoryでかなり人気があります。 – DeiDei
こんにちは@DeiDei、実際には、出力上でビット出力演算をいくつか行いたいと思います。例えば、〜output [0]&output [1] 'のようなものです。実際に私はこのビット単位の変換は行列の転置とは少し違うかもしれないと思うかもしれません。おそらく私たちはいくつかのメモリ操作を利用できますが、個人的に私たちがこのようにできるかどうかはわかりません。全体的に、ありがとうございます! –
"入力と出力はちょうど異なる方向のメモリを読み込んでいるので、ハードウェアが任意のビットアライメントでバイトサイズのメモリトランザクションをサポートできる場合にのみ当てはまります。それはしません。 – talonmies