• ベストアンサー

配列の格納

アルゴリズム初心者です。 配列Aの16×16ビットの図形データーを時計周りに90度回転し、配列Bに格納する処理内容の記述を教えて下さい。 上からI番目、、左からJ番目をA(I,J)、B(I,J)とします。

質問者が選んだベストアンサー

  • ベストアンサー
  • DT200
  • ベストアンサー率38% (63/164)
回答No.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位のマトリクスで考えて見て ビット情報がどのように移動するのか検証してください。

oyajipu
質問者

お礼

大変参考になりました。 有難うございました。

関連するQ&A

  • 配列の格納について

    再度投稿してます。 アルゴリズム初心者です。 配列Aの16×16ビットの図形データーを時計周りに90度回転し、配列Bに格納する処理内容の記述を教えて下さい。 上からI番目、、左からJ番目をA(I,J)、B(I,J)と表します。 例)配列A    配列B   1 2 3 4 5     1 2 3 4 5 1 0 0 0 0 0    1 0 0 0 0 0 2 0 1 1 1 0    2 0 1 0 1 0 3 0 0 1 0 0    3 0 1 1 1 0 4 0 1 1 1 0    4 0 1 0 1 0 5 0 0 0 0 0    5 0 0 0 0 0

  • 配列の合計値

    C言語の配列について質問です。基本的な質問で申し訳ないですが、ご回答いただければ幸いです。 24個の要素をもった配列Aに格納されている数字の4つごとの合計を、配列Bに格納したいです。 B[0]=A[0]+A[1]+A[2]+A[3] B[1]=A[4]+A[5]+A[6]+A[7]… イメージはこんな感じです。 ソースコードはどう書けばよいでしょうか…。 for(i=0;i<6;i++) for(j=0;j<4;j++) { B[i]+=A[i*4+j];} ではうまくできませんでした、これもなぜか分からなくて…よろしければ教えて下さい

  • 疑似言語で表現されたアルゴリズムについて…

    次の疑似言語で表現されたアルゴリズムを処理の概要の条件を満たしかたについて教えてください。 途中までは求められるのですが、(1)~(5)を教えてください。- (処理の概要) 配列Aには学生番号、配列Bには成績が格納されている。同じ添字の位置に対応する学生番号と成績が格納されている。配列の大きさは10件分である。成績の良い順(降順)に学生番号、成績とも並べ替える。 (配列のイメージ(例)) 添字  配列A  配列B      配列A  配列B 1   1001   50      1004  100   2   1002   75      1002  75 3   1003   25      1005  70 4   1004  100      1001  50 5   1005   70      1003  25 ・     ・     ・        ・    ・ ・     ・     ・        ・    ・ (擬似言語)   ・i←1    (1)   ■i<n   |   ・j←i+1   |   ■j≦n   |   |  ↑  (2)   |   |  |・w1←A(j)   |   |  |  (3)   |   |  |・A(j)←A(i)   |   |  |  (4)    |   |  |・A(i)←w1   |   |  |  (5)   |   |  ↓   |   |  ・j←j+1   |   ■   |  ・i←i+1   ■

  • OpenCV2-画素を配列に格納したい

    こんにちは。 私のパソコンにはOpenCV2.3をインストールしています。 たとえば、 IplImage* img; で読み込んだ画像を pixel[x][y] といった2次元配列に格納したいです。 といいますのも、 for(int i = 0; i < img->width; i++){ for(int j = 0; j < img->heifht; i++){ pixel[i][j] = ~~~~~~; } } といった処理をしたいからです。 ちなみに、この2次元配列にはRGBと輝度値が入っていればOKです。 ...説明が不十分ですが、どうか教えていただけるとすごく助かります>< お願いします!

  • String配列を扱うアルゴリズムについて

    よりパフォーマンスの良いアルゴリズムが、 ございましたらご教示下さい。 数レコード分のDBテーブルデータが格納されたString[][]型が存在するとします。 配列の要素は、String[行(フィールド)][列(カラム)]です。 ここで、全レコード中の列ごとの最大文字列長を int[]型に取得したいと思います。 そうした場合、自作した下記の処理よりも、 よいパフォーマンスを得られるアルゴリズムがございましたら、 ご教示願いたいと思います。 ※処理前提条件 ●String[][]型変数に、過不足無くテーブルデータが格納済みであるとします。 ●配列の第一(行)・第二(列)要素の最大値は取得済みであるとします。 ////////////// // 変数定義 // ////////////// String[][] tableData; ← テーブルデータ格納済み(過不足はありません) int 行数 = 全行数(取得済み); int 列数 = 全列数(取得済み); //列毎の最長文字列値を格納する。 int[] maxLen = new int[列数]; ////////// // 処理 // ////////// //列の個数分、処理を繰り返す for(int i = 0; i < 列数; i++) {   //行の個数分、処理を繰り返す   for(int j = 0; j < 行数; j++) {     //NULLを回避する     if(tableData[i][j] != null) {       //int配列に格納済みの数値より大きければ、改めて格納する       if(maxLen[i] < tableData[i][j].length()) {         maxLen[i] = tableData[i][j].length();       }     }   } } 以上です、どなかお知恵をお貸し頂けませんか。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • 配列への文字列の格納について

    C言語で文字列を扱う時、配列に1文字ずつ格納していくか、ポインタ変数を使うと思うのですが、 ポインタ変数を使った場合の処理が上手くできずに困っています。 詳細を説明すると、値を取得して、前回取得した値と比較します。 それで、同じだった場合には"chritm1"に格納した矢印を書き込む処理なのですが、 現在はfor文により配列に格納したものを使用していますが、 この部分をポインタ変数を使用した処理(1文字1文字書くのではなく、string型変数の用に書き込みたい) に変更したいのですが、上手くできないという状況です。 何かとっかかりとなるようなことでもかまいませんので、教えてください。 よろしくお願いします。 static int mainA( char *fileName){ int loop, i, j; FILE *fd; /* 前回値格納用 */ char *preval; /* 現在値格納用 */ char *thisval; /* 同値用記号格納用 */ char chritm1[6] = " → "; -- 中略 -- for( i = 0 ; i < 150 ; i++ ) { thisval = redata[i]; /* 値の比較 */ if(preval == thisval) { for( j = 0 ; j < 6 ; j++){ /* 前回値と同じ場合は矢印 */ fprintf( fd, ",%c",chritm1[j]); } }else{ /* 前回値と異なる場合は値 */ fprintf( fd, ",%s", thisval); } preval = thisval; /*完了したら改行 */ fprintf( fd, "\n" ); } -- 以下略 --

  • 配列のコピー

    BVA初心者です。 基礎の基礎なのですが、質問させていただけないでしょうか。 excel VBAで、いま画面に 12345678910 12345678910 12345678910 ・・・・・・ と、あります。 これと、同じ配列を、右端にも作りたいのですが、 ”A(i, 1) = A(i, JMAX + 1)” のような記述方法で、全体をコピーすることはできますか?(copyメソッドは使わないで、できるはずなのですが・・・。) コピーができずに困ってます、よろしくお願いします。 Const IMAX As Long = 10 Const JMAX As Long = 10 Sub A() Cells.Clear Dim A(IMAX + 1, JMAX + 1) As Long Dim B(IMAX + 1, JMAX + 1) As Long For i = 1 To IMAX + 1 For j = 1 To JMAX Cells(i, j) = j A(i, 1) = A(i, JMAX + 1) '左端の配列を一番右にコピーする A(i, JMAX + 2) = A(i, 2) '左から2番目の配列を右から2番目にコピーする Next Next End Sub

  • 2次元配列への格納方法について

    こんにちは。 FILE *fp; SIZE 1024; int n; char Buf[1025]; while((n = fread(Buf,1,SIZE,fp)) != 0){ } というように、fread関数を用いて1024バイトずつ配列Bufへ格納しています。 以下に示すようなことを行う場合、どのように記述すればよいのでしょうか? B:バイナリデータ T:数値 TBBBBBBBBB・・・・・・B←1024バイト目 TBBBBBBBBB・・・・・・B ・ ・ ・ ・ TBBBBBBBBB・・・・・・B というように、配列内に格納したいと思っています。 Tは、テキストデータで1,2,3・・・・100という整数型を格納。Bは、バイナリデータでfread関数から取得したバイナリデータを格納します。 なぜ、Tを格納したいかといいますと、どのバイナリデータを指しているか?を判別するためです。 上記のようなことを行うためには、2次元配列を使用すればよいのでしょうか? 例:char Buffer[100][1025]

  • 配列名を取得するVBA?

    ACCESSを使って勉強中です。 VBAを記述中に疑問がわきましたのでどなたか教えてください。。 配列 a(4)の中には1か2のデータが格納されるようになっています。 格納されるのはランダムになっています。 そこで、配列の中に1があったら、それが何番目にはいっているのか a(?)というのを取得したいのですが、そういうことは可能でしょうか? よろしくお願いします。

  • [マクロ]配列を区切り文字で変数に格納する方法

    タイトルの通りなのですが、 例えば、 A1~B10にランダムな数字が入っています。 (1)A1~B10を配列Cに格納します。 (2)配列C(1,10)を変数test1に格納します。  ※その時に各配列を/で区切る (3)配列C(2,20)を変数test2に格納します。  ※その時に各配列を/で区切る (4)test1をセルC1に記入 (5)test2をセルC1に記入 のような感じです。 配列に格納する方法はさすがに分かるのですが、区切り文字を入れて変数に格納する方法が分かりません。。。。 ご教授お願いいたします。

専門家に質問してみよう