- ベストアンサー
配列の格納
アルゴリズム初心者です。 配列Aの16×16ビットの図形データーを時計周りに90度回転し、配列Bに格納する処理内容の記述を教えて下さい。 上からI番目、、左からJ番目をA(I,J)、B(I,J)とします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
環境が不明なので、とりあえずCで記述して見ました。 /* * ビッグエンディアンでメモリに配置されている * 16X16のビット情報を時計回りに90度回転する */ rotate( unsigned short *array ) { unsigned short wrk[ 16 ]; unsigned short x, y; int i, j; unsigned short m; /* *作業領域をクリアする */ for( i = 0 ; i < 16 ; i++ ){ wrk[ i ] = 0; } for( i = 0 ; i < 16 ; i++ ){ /* * 行の16ビットを取り出す(バイトオーダーの変換も行なう) */ x = ntohs( array[ i ] ); m = 0x8000; /* テストするビット位置(MSB→LSB) */ for( j = 0 ; j < 16 ; j++ ){ /* * 列のビットデータをテストする(MSBからLSBへ) */ if( ( x & m ) != 0 ){ /* * ビットが立っていたら、時計方向に90度回転する。 * 行データは列データのLSB側から順次MSB側へ移動する。 * メモリ上に配置されるときのバイトオーダーを考慮し * バイトオーダーの変換もしている(メモリ上にはビッグ * エンディアンで配置されることを前提)。 */ y = ntohs( wrk[ j ] ); y |= ( 1 << i ); wrk[ j ] = htons( y ); } m >>= 1; /* テストするビット位置を右へ移動 */ } } /* * 変換が完了した作業量域のデータを元の配列に戻す。 */ for( i = 0 ; i < 16 ; i++ ){ array[ i ] = wrk[ i ]; } } PS: 適切なカテゴリでの質問なら的確な回答が得られるかも。 実行結果は期待されるものになるのは確認してます。あとは、 環境に合わせて直してください。 また、ロジックそのものは3x3位のマトリクスで考えて見て ビット情報がどのように移動するのか検証してください。
お礼
大変参考になりました。 有難うございました。