🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

614閲覧

C言語でのfor文の効率化 処理の簡素化

alles-durch

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2021/02/08 14:59

編集2021/02/09 00:30

前提・実現したいこと

コードを書いてみたんですがもっとfor文のところを効率的にまとめる方法はありませんか?
最初にCとXOR
関数に入れてdを取得
d値と次のa(a+16)とXOR
関数に入れて再びdを取得
d値と次のa(a+16)とXOR
以降この繰り返し

unsigned char a[64]= {0}; unsigned char b[16]= {0}; unsigned char c[16]= {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; unsigned char d[64]= {0}; -省略- fread( a, sizeof(char), sizeof(a), file1 ); fread( b, sizeof(char), sizeof(b), file2); for(i=0;i<16;i++){ a[i]=a[i]^c[i]); }  for(i=0;i<16;i++){ kansuu(&a[i],b,&d[i]); } for(i=0;i<16;i++){ a[i+16]=a[i+16]^d[i] } for(i=0;i<16;i++){ kansuu(&a[i+16],b,&d[i+16]); } for(i=0;i<16;i++){ a[i+32]=a[i+32]^d[i+16] } for(i=0;i<16;i++){ kansuu(&a[i+32],b,&d[i+32]); } for(i=0;i<16;i++){ a[i+48]=a[i+48]^d[i+32] } for(i=0;i<16;i++){ kansuu(&a[i+48],b,&d[i+48]); } 上記記入間違いでした。 訂正 for(i=0;i<16;i++){ a[i]^=c[i]; } kansuu(a,b,d); for(i=0;i<16;i++){ a[i+16]=a[i+16]^d[i] ; } kansuu(a+16,b,d+16]); for(i=0;i<16;i++){ a[i+32]=a[i+32]^d[i+16] ; } kansuu(a+32,b,&d+32); } for(i=0;i<16;i++){ a[i+48]=a[i+48]^d[i+32] } kansuu(a+48,b,d+48); }

##試したこと

a[i]=a[i]^c[i]); for(i=0;i<64;i++){ if(i==0){ kansuu(&a[i],b,&d[i]) } if(i>0){ kansuu(&a[i],b,&d[i]); a[i+16]=a[i+16]^d[i]; kansuu(&a[i+16],b,&d[i+16]); } }

補足情報(FW/ツールのバージョンなど)

C言語 VisualStudioCode LINUX

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/02/09 00:26

kansuuの中身次第なところがあると思いますが。
alles-durch

2021/02/09 01:48

そうですか、戻り値はそのまま同じように出る形にはしていますが わかりました。
guest

回答4

0

書く前に問題が変わってたので・・・
一応修正して、c,dまとめる部分だけを

cとdをまとめてる形で保持すると、それを配列eとするとforの中身は、かなりシンプルに

C

1 2unsigned char e[16+64]={ cの中身,dの中身 } 3unsigned char *d=&e[16]; 4 5for(j=0;j<4;j++){ 6 for(i=0;i<16;i++){ 7 a[i+j*16]^=e[i+j*16]; 8 } 9 kansuu(&a[j*16],b,&e[j*16+16]); 10} 11

投稿2021/02/09 03:21

tmp

総合スコア303

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alles-durch

2021/02/09 03:49

回答ありがとうございます。 シンプルになりますね。 e[]のc.dの中身は直接入力ってことですか?
guest

0

ベストアンサー

C

1 for (i = 0; i < 16; i++) a[i] ^= c[i]; 2 for (i = 0; i < 16; i++) kansuu(a + i, b, d + i); 3 for (i = 16; i < 64; i += 16) { 4 k = i + 16; 5 for (j = i; j < k; j++) a[j] ^= d[j - 16] 6 for (j = i; j < k; j++) kansuu(a + j, b, d + j); 7 }

追記
問題が変わったので書き直しました。

C

1 int i, j, k; 2 for (i = 0; i < 16; i++) 3 a[i] ^= c[i]; 4 kansuu(a, b, d); 5 for (i = 16; i < 64; i = k) { 6 for (j = i, k = i + 16; j < k; j++) 7 a[j] ^= d[j - 16] 8 kansuu(a + i, b, d + i); 9 }

投稿2021/02/08 16:56

編集2021/02/09 04:07
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alles-durch

2021/02/09 03:18

回答ありがとうございました。 参考にさせていただきました。 載せていたコードに不備がありました。
alles-durch

2021/02/09 10:26 編集

ありがとうございました。とてもスマートにまとられて簡略化できました。jkの使い方がなぜそうなるのかがよくわかりませんが期待値がでました。 a∧cとkansuu後に for文逆順で戻す場合は int i, j, k; for (i = 0; i < 16; i++) a[i] ^= c[i]; kansuu(a, b, d); for (i = 16; i < 64; i = k) { for (j = i, k = i + 16; j < k; j++)    kansuu(a +i,b,d +i)    }   }   for (i = 0; i < 64; i = k) { d[i +16 ] ^= a[i]; }で戻すことができましたが、違うやり方もありますか?
kazuma-s

2021/02/09 16:42

kansuu の仕様が不明であり、入力例も期待値も不明なので、戻すという処理がどういうものか分かりません。
alles-durch

2021/02/09 16:55

わかりました。ありがとうございます
guest

0

for(i=0;i<16;i++){ a[i]^=c[i]; } kansuu(a,b,d); for (count=0;count<4;count++){ if(count==0){ kansuu(a,b,d); } if(count==1){ for(i=0;i<64;i++){ a[i+(count*16)]=a[i+(count*16)]^d[i]; } kansuu(a+(count*16),b,d+(count*16)); } if(count>1){ for(i=0;i<64;i++){ a[i+(count*16)]=a[i+(count*16)]^d[i+(count*16-16)]; } kansuu(a+(count*16),b,d+(count*16)); } }

で最低限の解決をしました。
アドバイスありがとうございました。
誤記等変換ミス等があり修正させていただきました。
参考にさせていただいたことで解決し、自己解決欄に当初間違えて記入してしまいました。
申し訳ありません。

投稿2021/02/09 03:32

編集2021/02/15 13:13
alles-durch

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2021/02/09 03:51

全角文字の「==」や「(count×16)」がコンパイルエラーになります。 ) や { の対応も取れていません。本当に解決ですか?
alles-durch

2021/02/09 09:56

環境が違くて携帯で返答していため誤記や変換ができませんでした。
guest

0

for(i=0;i<16;i++){
a[i]=a[i]^c[i]);
kansuu(&a[i],b,&d[i]);
a[i+16]=a[i+16]^d[i]
kansuu(&a[i+16],b,&d[i+16]);
a[i+32]=a[i+32]^d[i+16]
kansuu(&a[i+32],b,&d[i+32]);
a[i+48]=a[i+48]^d[i+32]
kansuu(&a[i+48],b,&d[i+48]);
}

でいけそうやけど

投稿2021/02/08 15:16

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alles-durch

2021/02/08 15:53

回答ありがとうございます。 その方法でも試しましたが最初の16バイトのみでそこからは値と違っていました。 言葉足りずですいません。 現在は64バイトですが、64バイト以上のサイズになった場合を考えると毎回増やしていくのが大変になってくるので効率化を考えていました。
y_waiwai

2021/02/08 22:29

デバッグできる環境を整えて、どこのステップで数字が違うのか追いかけていけばどうでしょう。 コードだけ眺めてあれこれ言ってもしよーがないですよ
alles-durch

2021/02/09 00:36

ありがとうございます。 デバッグしたり、コード変えたりしながら空き時間には色々ためしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問