1 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 15:14:51 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.46【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1198755167/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
367 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:25:38 ] めでたし、めでたし。
368 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:29:54 ] 日本語のWindows98で動くプログラムは_MBCS指定しますか?
369 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 16:00:55 ] ケースバイケース
370 名前:デフォルトの名無しさん [2008/01/24(木) 19:33:00 ] 32bit数どおしの足し算が範囲を超えたのかチェックするにはどうすればいいですか if無しで出来ますか
371 名前:デフォルトの名無しさん [2008/01/24(木) 19:37:22 ] a、bが1ビットならば a + b = (a and b, a xor b)_(2) ですが32bitはどうすればいいですか
372 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:41:31 ] 複数ビットの加算器 ttp://ja.wikipedia.org/wiki/%E5%8A%A0%E7%AE%97%E5%99%A8#.E8.A4.87.E6.95.B0.E3.83.93.E3.83.83.E3.83.88.E3.81.AE.E5.8A.A0.E7.AE.97.E5.99.A8
373 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:42:57 ] >>370 何も考えずに、一番簡単なやり方でやろうと思えば、64bit整数にキャストして足し算してしまうことだな。 後は(a+b) と aの大小を比較するとか。
374 名前:デフォルトの名無しさん [2008/01/24(木) 19:45:23 ] 比較とかキャストしないでマシンに手間がかからないでやる方法ないですか
375 名前:デフォルトの名無しさん [2008/01/24(木) 19:48:02 ] >>372 C言語は、1bit単位の変数ないし、加算器をソフトウェアで実装すると鈍いです 速い方法ないですか
376 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:50:15 ] a + b > INT_MAX ↓ a > INT_MAX - b
377 名前:デフォルトの名無しさん [2008/01/24(木) 19:51:39 ] 1bitみたいに桁上がりをandや+を使ってわかりませんか
378 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:53:06 ] 比較っつっても真偽値取得するだけなら setxx 命令使えるから遅くはならないと思うがね。
379 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:57:07 ] キャリーフラグとか? まぁ、どっちにしても比較はいるわなぁ……
380 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:58:15 ] a + bで、 aとbの符号が異なれば、オーバーフローすることはない。 同符号の場合、aやbの符号とa + bの符号が異なれば、オーバーフローしている。
381 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:59:57 ] インラインアセンブリ?
382 名前:370 [2008/01/24(木) 20:02:29 ] いい方法みつけたような気がします unsigned intだとします 桁上がりが起こるならどちらかの31bit目が1です 2^32からその数を引けばあといくつで桁上がりするかわかります そこで2の補数を求めてから2つの数を足してみて、31bit目が1なら負なので桁上がりしません
383 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:03:00 ] mov eax, a xor edx, edx add eax, b setc dl もうこれでええっしょ。
384 名前:370 [2008/01/24(木) 20:10:10 ] 間違えました でもいい線いってるきはします
385 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:10:12 ] OFビットを見るほうがいいんでね?
386 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:13:44 ] 久しぶりだからOFとか忘れてたお・・・
387 名前:370 [2008/01/24(木) 20:17:58 ] a+b; のあとにOFはどうすれば調べられるんですか
388 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:18:43 ] インラインアセンブリでごりごり
389 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:21:59 ] ((a >> 1) + (b >> 1) + (a & b & 1)) & 0x80000000 これでどうよ? シフト2回入っちゃうけど。
390 名前:370 [2008/01/24(木) 20:27:42 ] 良いですね 下位1bitの桁上がりを求めて、1bitシフトさせたものに加えれば桁上がりがわかりますね サンクス
391 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:29:19 ] 何か a >= (unsigned)-b の方が速い気がする。 ちゃんと実測してソースつきで報告よろ。
392 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:41:43 ] 符号ありなの無しなの?
393 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:44:21 ] なしっぽい流れ
394 名前:370 [2008/01/24(木) 20:58:30 ] なんか、if文の方が速いかも・・・BCC5.5の場合 #include <iostream> #include <time.h> using namespace std; #define N 1000000 #define rd() (rand()&255) #define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24) main(){ unsigned int *a=new unsigned int [N]; unsigned int *b=new unsigned int [N]; int n,cl,clsum[3],s=0; for(n=0;n<3;n++)clsum[n]=0; for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();} for(int k=0;k<200;k++){ cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl; cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1 )+(b[n]>>1 )+(a[n]&b[n]&1))>>31 ;clsum[1]+=clock()-cl; cl=clock();for(n=0;n<N;n++){unsigned int x=a[n],y=b[n];s+=((x>>1 )+(y>>1 )+(x&y&1))>>31 ;}clsum[2]+=clock()-cl; } cout<<"if文の速度 "<<clsum[0]<<endl; cout<<"if無しの速度1 "<<clsum[1]<<endl; cout<<"if無しの速度2 "<<clsum[2]<<endl; }
395 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 20:59:26 ] >>31 は遅いと思う。
396 名前:デフォルトの名無しさん [2008/01/24(木) 21:00:27 ] 最適化しないように文末にcout<<(s&1);を入れて下さい
397 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:00:39 ] if文じゃないだろif文じゃw 条件式だ。
398 名前:デフォルトの名無しさん [2008/01/24(木) 21:08:11 ] メモリアクセスに時間かかるようなのでパラメータ変更しました これだと微妙に論理演算のほうが速いかも #include <iostream> #include <time.h> using namespace std; #define N 10000 #define rd() (rand()&255) #define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24) main(){ unsigned int *a=new unsigned int [N]; unsigned int *b=new unsigned int [N]; int n,cl,clsum[3],s=0; for(n=0;n<3;n++)clsum[n]=0; for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();} for(int k=0;k<30000;k++){ cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl; cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1 )+(b[n]>>1 )+(a[n]&b[n]&1))>>31 ;clsum[1]+=clock()-cl; cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1 )+(y>>1 )+(x&y&1))>>31 ;}clsum[2]+=clock()-cl; } cout<<"if文の速度 "<<clsum[0]<<endl; cout<<"if無しの速度1 "<<clsum[1]<<endl; cout<<"if無しの速度2 "<<clsum[2]<<endl; cout<<(s&1); }
399 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:13:15 ] #include <stdio.h> #include <time.h> #define N 10000000 int main() { unsigned a, b=0; int k; int cl, clsum[2] = {0}; for(k=0;k<200;k++) { cl=clock(); for(a=0;a<N;a++)b+=(a>=(unsigned)-b); clsum[0]+=clock()-cl; cl=clock(); for(a=0;a<N;a++)b+=((a>>1 )+(b>>1 )+(a&b&1u))&0x80000000u; clsum[1]+=clock()-cl; } printf("条件式 : %d\n", clsum[0]); printf("ビット演算: %d\n", clsum[1]); printf("%u\n", b); return 0; } 条件式 : 1004 ビット演算: 1235 1
400 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:14:47 ] 最適化忘れてた 条件式 : 600 ビット演算: 677 MacOSX Core2Duo 2.16GHz gcc -O2
401 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:17:28 ] #include <stdio.h> #include <time.h> #define N 10000000 int main() { unsigned a, b=0; int k; int cl, clsum[3] = {0}; for(k=0;k<200;k++) { cl=clock(); for(a=0;a<N;a++)b+=(a>=(unsigned)-b); clsum[0]+=clock()-cl; cl=clock(); for(a=0;a<N;a++)b+=((a>>1 )+(b>>1 )+(a&b&1u))&0x80000000u; clsum[1]+=clock()-cl; cl=clock(); for(a=0;a<N;a++)b+=((a>>1 )+(b>>1 )+(a&b&1u))>>31 ; clsum[2]+=clock()-cl; } printf("条件式 : %d\n", clsum[0]); printf("ビット演算1: %d\n", clsum[1]); printf("ビット演算2: %d\n", clsum[2]); printf("%u\n", b); return 0; } 条件式 : 566 ビット演算1: 672 ビット演算2: 701 やっぱり条件式が一番速い。
402 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:20:42 ] std::exceptionを継承して使う場合 勝手にメンバとか付け足してもいいですか? たとえばHRESULTとか
403 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:20:57 ] ビット演算は健闘はしているけど、 いかんせん式が複雑すぎたな。
404 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:21:23 ] >>402 お好きにどうぞ
405 名前:デフォルトの名無しさん [2008/01/24(木) 21:21:51 ] 『最大50桁の自然数2つを、文字列として入力させて積を出す』 という問題が出たんですが。 先生とのメールのやりとり↓ 私「筆算の方法で行う」 先「積は和の繰り返しで表すこともできます」 私「最初の数値を次の数値分だけ足し算する (2×3 = 2+2+2)」 先「桁数が多い場合単純に繰り返すだけではだめです」 どうすればいいでしょうか(:_;) お願いします
406 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:22:47 ] コピペか?
407 名前:デフォルトの名無しさん [2008/01/24(木) 21:24:43 ] >>398 をVC++6でやると論理演算の方が速いよ 1248 1108 1425 となる BCC5.5では 1931 2878 2160
408 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:24:43 ] 最近どっかで見たな。
409 名前:407 [2008/01/24(木) 21:28:38 ] GCC(MinGW)では 829 1236 1841 同一スペックで>>398 を動かしたとき
410 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:37:26 ] >>398 ウチではこうなった。 1245 688 1302
411 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:38:58 ] >>398 ウチではこうなった。 if文の速度 100 if無しの速度1 111 if無しの速度2 107
412 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:40:17 ] あまりに早く終わるので N を 10 倍した if文の速度 896 if無しの速度1 1008 if無しの速度2 1061
413 名前:407 [2008/01/24(木) 21:47:10 ] 単純な計算と比べてもほんど無視できる程度しか変わらなかったよ・・・ #include <iostream> #include <time.h> using namespace std; #define N 10000 #define rd() (rand()&255) #define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24) main(){ unsigned int *a=new unsigned int [N]; unsigned int *b=new unsigned int [N]; int n,cl,clsum[4],s=0,t=0; for(n=0;n<4;n++)clsum[n]=0; for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();} for(int k=0;k<30000;k++){ cl=clock();for(n=0;n<N;n++)t|=a[n]&b[n]&1;clsum[3]+=clock()-cl; cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl; cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1 )+(b[n]>>1 )+(a[n]&b[n]&1))>>31 ;clsum[1]+=clock()-cl; cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1 )+(y>>1 )+(x&y&1))>>31 ;}clsum[2]+=clock()-cl; } cout<<"比較演算の速度 "<<clsum[0]<<endl; cout<<"論理演算の速度1 "<<clsum[1]<<endl; cout<<"論理演算の速度2 "<<clsum[2]<<endl; cout<<"単純な論理演算の速度 "<<clsum[3]<<endl; cout<<(s&t&1); }
414 名前:407 [2008/01/24(木) 21:49:39 ] >>412 Nはランダムの2数を確保する数なので大きくすると 純正のメモリ外に書き込まれる可能性が出てきてしまいます 増やすときは、kの繰りかえし数を上げてみて下さい
415 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:53:01 ] >>414 ううん。微妙な結果。 if文の速度 1004 if無しの速度1 996 if無しの速度2 1112
416 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 21:58:55 ] 安定して正確な速度がはかれるっぽいコードです・・・スタック領域に少量確保しました わずかに論理式のほうが速いかもしれないです #include <iostream> #include <time.h> using namespace std; #define kukikaesi 300000 main(){ #define N 1000 unsigned int a[N],b[N]; int n,cl,clsum[4],s=0,t=0; for(n=0;n<4;n++)clsum[n]=0; for(n=0;n<N;n++){ #define rd() (rand()&255) #define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24) a[n]=rnd(); b[n]=rnd();} for(int k=0;k<kukikaesi;k++){ cl=clock();for(n=0;n<N;n++)t|=a[n]&b[n]&1;clsum[3]+=clock()-cl; cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl; cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1 )+(b[n]>>1 )+(a[n]&b[n]&1))>>31 ;clsum[1]+=clock()-cl; cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1 )+(y>>1 )+(x&y&1))>>31 ;}clsum[2]+=clock()-cl; } cout<<"比較演算の速度 "<<clsum[0]<<endl; cout<<"論理演算の速度1 "<<clsum[1]<<endl; cout<<"論理演算の速度2 "<<clsum[2]<<endl; cout<<"単純な論理演算の速度 "<<clsum[3]<<endl; cout<<(s&t&1); }
417 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:02:21 ] 微妙すぎるのでこれにて終了します ありがとうございました
418 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:04:48 ] >>416 VC++2008EE Debugビルド Vista Athlon Dual 4400+ 2.31GHz 比較演算の速度 2030 論理演算の速度1 2678 論理演算の速度2 1948 単純な論理演算の速度 1817
419 名前:デフォルトの名無しさん [2008/01/24(木) 22:32:23 ] 超初心者の質問なのですが、、、 #include <iostream> int main() { double a = 3.55; int n = a * 100; std::cout << n << std::endl; return 0; } これの出力が354になります。355ではなく354になるのはどうしてなのでしょうか?
420 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:40:51 ] 3.55は浮動小数点だと無限小数になって、Intに型変換すると切り捨て誤差が出る。 詳しい解説が読みたければ「浮動小数点 誤差」くらいでぐぐってみれ。
421 名前:デフォルトの名無しさん [2008/01/24(木) 22:42:28 ] >>405 回数分足すのはさすがに重いだろ 一桁ずつ掛けて、そのあと和の繰り返しを使うんじゃないのか? 例えば112×235なら 5×112=560 3×112=336 2×112=224 560+3360+22400=26320 とか まあ俺の力じゃプログラムは作れないけどなw
422 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:43:32 ] >>419 VC++ 2008 では355になる。
423 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:44:31 ] xに近い整数にするには、x +0.5を整数にすればいいのでは 変換時に切り捨てられる為
424 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:45:27 ] >>420 a * 100 ではintの100がdoubleに昇格して計算されて結果もdoubleだろ。 355になった後でintに変換されるから関係ないと思うんだが。
425 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:46:19 ] 354.99999999999999999なら354
426 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:47:56 ] >>425 おお、そういうことか。あくまでも近似値なんだよな。
427 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:49:05 ] BYTE値を0.75倍し、その整数部のみを得たいのですが、 単に0.75を掛けて少数切捨てするより効率がよくて速度出る計算方法がありますかね BYTE >> 1 のようなもの(これは1/2ですが…)があれば教えていただけませんか?
428 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:51:59 ] >>421 それ思いっきり筆算じゃね? >>405 先生が何させたいかさっぱりわからんのだわ。 50桁くらいならFFTとか組むより筆算で十分な速度でる。 多倍長演算なら↓みたいなアルゴリズムのサイトあるけど さすがにそんなとこまで求めてないと思うんだよな。 poset.jp/ompa/index.html
429 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:56:19 ] >>427 コンパイラの最適化に任せる。 整数で処理する(最適化に負けるかもしれない) int value = 123456; value = value * 75 / 100; シフト演算で頑張ってみる(1/2+1/4なので) int value = 123456; value = value >> 1 + value >> 2
430 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:56:25 ] >>427 (BYTE)(((WORD)x) * 3 / 4)
431 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:56:53 ] >>427 (BYTE + BYTE << 1) >> 2
432 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:59:31 ] (x + (x<<1)) >> 2
433 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:00:15 ] >>429-431 おおいろいろ方法があるんですね みなさんありがとうございます! 早速試してみますね
434 名前:デフォルトの名無しさん [2008/01/24(木) 23:02:56 ] >>428 スマン思いっきし筆算だった
435 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:07:35 ] 1 の位 = 1 の位の積の 1 の位 10 の位 = (1 の位と 10 の位の積の 1 の位 + 1 の位の積の 10 の位) の 1 の位 100 の位 = 1 の位と 100 の位の積の 1 の位 + 10 の位の積の 1 の位 + (1 の位と 10 の位の積の 1 の位 + 1 の位の積の 10 の位) の 10 の位 : : :
436 名前:デフォルトの名無しさん [2008/01/24(木) 23:08:23 ] >>405 俺が思うに お前の筆算の仕方が間違ってたんじゃないのか 筆算以外にやりようないと思うんだが
437 名前:405 [2008/01/24(木) 23:29:58 ] 先生にまた聞いたら筆算のしかたが間違ってたみたいです、、 >>421 みたいなやりかたどうやるんですか? ぼくのだと 「112*235=560+336+224=1120」になっちゃいます
438 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:31:59 ] 桁シフトしとらんがな。 つーか、どうせならインド式実装してみたら?
439 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:34:32 ] newで配列として確保した後、その要素数を取得する方法はありますか?
440 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:36:15 ] 基本的にはない。 つーか、大抵の場合は std::vector 使っておけば問題ない。
441 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:36:37 ] >>439 嫌になるほど繰り返し質問されていることですが、ありません。 newなんて使わずにstd::vectorを使いましょう。
442 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:36:46 ] ない。std::vectorでも使え。
443 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:37:56 ] std::vector 使え!
444 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:38:18 ] std::vector使えよ
445 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:39:02 ] 場合によっては取得できるんだが・・・ そういう事はむやみに教えると悪い影響与えそうで困る。
446 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:40:03 ] std::vectorってなんですか?習ってないです。
447 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:40:19 ] 増やした分を保持しておけばよいが、vectorは勝手に保持するからプログラムが簡単になる
448 名前:439 mailto:sage [2008/01/24(木) 23:40:37 ] みんなThx!ふと気になってレス見ないで書いちゃった、スマソ。。
449 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:42:03 ] #include <vector> using namespace std; main(){ vector < int > a(100); a[0]=1; a[1]=2; }
450 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:43:36 ] main.cpp:4: error: ISO C++ forbids declaration of ‘main’ with no type main.cpp:4: error: ISO C++ forbids declaration of ‘main’ with no type lipo: can't figure out the architecture type of: /var/tmp//ccLa7Foj.out make: *** [debug/main.o] Error 1
451 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:48:58 ] 今年のカレンダー表示ってどうやるんですか?
452 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:52:00 ] 作って表示すれば?
453 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:58:43 ] エンディアンの勉強をしてまして、色々ググってみると、例えばリトルエンディアンの場合、 0x1234abcd の値をメモリーに格納する際、下位アドレスから順に、cd ab 34 12 と入りますが、 ここで疑問なのが、1バイトの中身のビット列はどのように扱われているのか?という点です。 1バイト8bit分のデータは、エンディアンにかかわらず常に、例えば 0x12 は、00010010 のビット列 が保たれているのでしょうか?
454 名前:405 [2008/01/25(金) 00:03:17 ] 405ですが 筆算の問題、 >>421 みたいに全部かけた後にまとめて足すってできるんですか? それとも2桁ずつ掛け算して足してかないとむり? 例えば123*123だったら 123*3=369 123*2=246 →369+2460=2829 123*1=123 →2829+12300=15129
455 名前:デフォルトの名無しさん [2008/01/25(金) 00:07:35 ] >>454 421のやりかたでできるだろ 下のだとめんどくさくないか? よくわからんのだが
456 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:21:15 ] >>453 エンディアンは多バイトデータの配置の種類 1バイトは関係ない(同じ内容になる)
457 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:29:57 ] >>453 1バイトがどのように格納されていようが、 どうせ1バイト単位でしかメモリアクセスできないのだから、 違いは観測できないだろ。
458 名前:457 mailto:sage [2008/01/25(金) 00:34:10 ] そういえば、ビットアクセス命令のあるCPUもあるか・・・
459 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:40:27 ] 1byteが12bitの環境もあるわけで
460 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:41:05 ] 環境がBCCDeveloperというものです。 hoge.txtという名前のテキストファイルを作るプログラムで 同じフォルダの中にすでにhoge.txtという名前のテキストファイルがあったら もともとあったテキストファイルの名前をhoge1.txtとして変えて新しく作るテキストファイルを hoge.txtとすることはできるでしょうか。 できる場合はどうしたらいいでしょうか。
461 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:45:23 ] >>460 hoge.txtがあるかどうかを調べる あったらファイル名を変更する hoge.txtを作る System("if exist ren hoge.txt hoge1.txt");っていけるのかな?
462 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:51:48 ] >>461 すばやい回答ありがとうございました。 早速とりかかってみたいと思います。
463 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:54:52 ] >>454 とりあえず10桁で作ってやったぞ。わからんとこあったら聞いてくれ。 #define N 10 int main( void ) { int a[ N ] = {0,1,2,3,4,5,6,7,8,9};// 9876543210 int b[ N ] = {0,1,2,3,4,5,6,7,8,9};// 9876543210 int result[ N * 2 ] = { 0 }; // 9876543210*9876543210=97546105778997104100 for ( int i = 0; i < N; i++ ) { for ( int j = 0; j < N; j++ ) { result[ i + j ] += ( a[ i ] * b[ j ] ); for ( int k = i + j; k < N * 2 - 1; k++ ) { if ( result[ k ] < 10 ) break; result[ k + 1 ] += result[ k ] / 10; result[ k ] %= 10; } } } for ( int i = N * 2 - 1; i >= 0; i-- ) { printf( "%d", result[ i ] ); } return 0; }
464 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:30:19 ] こんなかんじか #define kosu 4 add(unsigned int *a, unsigned int *b, unsigned int *c){ int ketaagari=0; for(int n=0; n<kosu; n++){ c[n]=a[n]+b[n]+ketaagari; ketaagari=a[n]>UINT_MAX-b[n]; }} seki(unsigned int *a, unsigned int *b, unsigned int *c){ }
465 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:34:37 ] 50桁までカウントさせるのが面倒で積は諦めた
466 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:44:04 ] 500メガ程度の複数のテキスト文書があるとします これから単語の頻度を求めたいとします どのようにしたらいいでしょうか? 単語は最低4バイトのものを言います 配列でカウントできないし良い方法ありますか
467 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:46:06 ] 3バイトの頻度なら、int