1 名前:デフォルトの名無しさん [2006/09/16(土) 09:46:26 ] 前スレ ビット演算 pc8.2ch.net/test/read.cgi/tech/1123918075/ 関連スレ アセンブラ… (゜□゜) ↑アッー!↓ pc8.2ch.net/test/read.cgi/tech/1148402614/ 関連情報 Hacker's Delight ttp://www.hackersdelight.org/ ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか ttp://www.amazon.co.jp/exec/obidos/ASIN/4434046683 ビットを数える・探すアルゴリズム ttp://www.nminoru.jp/~nminoru/programming/bitcount.html Bitboard ttp://en.wikipedia.org/wiki/Bitboard
152 名前:150 mailto:sage [2007/02/18(日) 21:13:28 ] ごめん、よく考えたら大したことなかった。 これでOKだ。 x = ( ( x >> 8 ) & 0x00ff00ff ) | ( ( x << 8 ) & 0xff00ff00 ); x = ( ( x >> 16 ) & 0x0000ffff ) | ( ( x << 16 ) & 0xffff0000 );
153 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 09:11:59 ] 単に x = (x & 0x000000ff) << 24 | (x & 0x0000ff00) << 8 | (x & 0x00ff0000) >> 8 | (x & 0xff000000) >> 24; と書いては何かまずいの? 152の方法だと1行目で算出したxを2行目で使っているので 1行目の処理と2行目の処理の並列性が無いし、マスク用の 定数が4バイトの2つ、3バイトの1つ、2バイトの1つで、 どのCPUを想定しているのかは知らないけど、普通は 上の方法のマスク定数より長いコードになるのでは。 24回のshiftが16回のshiftより時間がかかる状況なら 上の方法は好ましくないし、エンディアン変換のビット長が 64bitなら152の方法のほうが良いように思うが。
154 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 18:34:24 ] 普通に共用体でやった方がエレガントで早いと思いますが。。
155 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 21:49:23 ] 正直これでいいや。 ttp://msdn2.microsoft.com/ja-jp/library/a3140177(VS.80).aspx
156 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:52:40 ] >>155 ?
157 名前:デフォルトの名無しさん [2007/03/01(木) 22:52:20 ] あげ
158 名前:デフォルトの名無しさん mailto:sage [2007/03/21(水) 06:17:18 ] 任意のビット数のシフトやローテートてなんで1クロックで実行できねーの? 連続した場合ね。
159 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 00:34:10 ] 1024bitとか?
160 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 08:22:35 ] そもそも1クロックで実行っていつの時代のどのCPUの話だよ 30年前の8bit時代から頭の中進歩してないオジサマ丸出しだねw しかも昔の8bitマイコンだって命令サイクルと実クロックは別物だしね
161 名前:デフォルトの名無しさん mailto:sage [2007/03/22(木) 21:47:22 ] なんか言いたいんだろうけど、何を言いたいのかさっぱりわからん。 知ったか厨の典型だな。(w
162 名前:デフォルトの名無しさん [2007/04/07(土) 02:22:12 ] あげ
163 名前:デフォルトの名無しさん [2007/04/29(日) 08:20:14 ] a
164 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 10:38:15 ] 1Bit CPUの可能性について語れないのは素人。
165 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 10:44:47 ] cmos 4000 シリーズの事か?
166 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 10:52:16 ] MC14500 か
167 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 12:29:58 ] コネクションマシンか?
168 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 18:46:24 ] バイトの縛りがうざいんだよ
169 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 02:15:38 ] 22時以降はダメとか?
170 名前:デフォルトの名無しさん mailto:sage [2007/04/30(月) 07:39:02 ] ざぶんとん
171 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:17:24 ] >どっちかのbitが立ってることを確認するために >if(hoge & 0x000000C0) >みたいな書き方出来ると思うのですが >両方のbitが立ってることを確認したければ >if(hoge & 0x000000C0 == 0x000000C0) >って書くしか方法ないですか? 以下から正しいものを選べ 1) if(hoge & 0x000000C0 & 0x000000C0) 2) if((hoge & 0x000000C0) & 0x000000C0) 3) if(!((hoge & 0x000000C0) ^ 0x000000C0)) 4) if((hoge & 0x00000080) && (hoge & 0x00000040)) 5) if(~(hoge | ~0x000000C0)) 6) if(~(~hoge | ~0x000000C0))
172 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:20:41 ] (hoge & 0x000000C0) == 0x000000C0 が一番速いだろう。
173 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:30:47 ] #include <stdio.h> #define MASK 0x0000C0C0 int bittesta(int hoge) { if((hoge & MASK) == MASK){ return 1; }else{ return 0; } } int bittestb(int hoge) { if(!((hoge & MASK) ^ MASK)){ return 1; }else{ return 0; } } int main(int ac, char **av) { int hoge = 1234; bittesta(hoge); bittestb(hoge); return 0; }
174 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:31:55 ] _bittesta: pushl %ebp movl %esp, %ebp subl $4, %esp movl 8(%ebp), %eax andl $49344, %eax cmpl $49344, %eax jne L10 movl $1, -4(%ebp) jmp L9 L10: movl $0, -4(%ebp) L9: movl -4(%ebp), %eax leave ret _bittestb: pushl %ebp movl %esp, %ebp subl $4, %esp movl 8(%ebp), %eax andl $49344, %eax cmpl $49344, %eax jne L13 movl $1, -4(%ebp) jmp L12 L13: movl $0, -4(%ebp) L12: movl -4(%ebp), %eax leave ret
175 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:34:17 ] >>172 が正解なんだけど いまどきのコンパイラは >>171 (3) で書いても 最適化されて >>172 になってるんだね
176 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 22:06:56 ] ど素人です。質問があります。 例えば1か0が格納される変数(Aと仮定)のスイッチ切り替えの場合 【例@】 if(A == 1) { A = 0; } else { A = 1; } 【例A】 A = A ^ (0 + 1); この場合早いのはやはり例Aなのでしょうか?
177 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 22:13:48 ] A ^= 1; が速い。まあ、例2と同じだあな。
178 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 22:18:35 ] >>177 有難うございました。
179 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 22:24:42 ] SUBR #n Acc = n-Acc を持ってるCPUだと A = 1-A のが速かったりするぞ
180 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 00:48:43 ] >>177 ,179 いや、今回は1と0で設定されてるけどほんとは3と5かもしれないだろ そういう場合ってやっぱA ^= 1;とかA = 1-Aより A ^= (3 + 5);のほうが正解なんじゃないか? 1と0ならA = 1-Aとかでもいいんだけどな
181 名前:・∀・)っ-○◎● mailto:sage [2007/05/04(金) 00:52:14 ] A ^= 8; ???????????????????????????? Aには1か0が格納されるって最初の条件で確定してるんだが
182 名前:180 mailto:sage [2007/05/04(金) 00:53:56 ] >>181 汎用性を高めるって意味だよ
183 名前:・∀・)っ-○◎● mailto:sage [2007/05/04(金) 00:55:14 ] いや8はおかしいだろ常識的に考えて
184 名前:180 mailto:sage [2007/05/04(金) 00:55:36 ] A変数に1か0だけの設定なら A ^= 1;でいいと思うが A変数に3か5が入ってる設定だと A ^= 5;じゃダメだろ? だったらどちらにでも応用できる A ^= (1 + 0); A ^= (5 + 3); がいいんじゃないかって話をしたかっただけだ。
185 名前:・∀・)っ-○◎● mailto:sage [2007/05/04(金) 00:56:41 ] 8じゃ最下位ビットはトグルできません><
186 名前:180 mailto:sage [2007/05/04(金) 00:59:14 ] じゃあ7だこの野郎
187 名前:・∀・)っ-○◎● mailto:sage [2007/05/04(金) 00:59:43 ] ちなみに俺の回答は A = ~A;
188 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 01:01:02 ] 工エエェェ(´д`)ェェエエ工
189 名前:180 mailto:sage [2007/05/04(金) 01:01:45 ] 俺は今赤面しながら画面に張り付いてるwwwwwwwwww 確かに8じゃ無理だったwwwwwwwww
190 名前:・∀・)っ-○◎● mailto:sage [2007/05/04(金) 01:24:45 ] >>187 だと「1」にならないね。 仮に全ビット使う場合の話。 信号制御用の1ビットレジスタをこれで操作してたような。 0か1かならこっちのほうが素直か A = !A;
191 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 01:59:07 ] 3 と 5 のトグルなら A ^= 6; だな。 要するに A ^= (3 ^ 5);
192 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 08:32:25 ] 拡張して 0,1,2 のトグル a=(a+1) % 3 とか 0〜9 での循環a=(a+1) % 10とかになると途端に難しくなるな
193 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 08:50:20 ] WORD wに0x0001が含まれていて0x0010が含まれてない、の結果をBOOL bに納める式は どう書くと一番短いですか?
194 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 08:52:03 ] b = (w & 0x0011) == 0x0001;
195 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 08:59:54 ] if ((w && 0x0001) == 0x0001) { if ((w && 0x0010) != 0x0010) { b = TRUE; } else { b = FALSE; } }
196 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 09:05:23 ] >>194 ありがとん
197 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 09:17:53 ] a:= a +1; a:= (a+ (a shr 2) ) and 3; これだと 1,2,3の循環になるな
198 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 12:09:44 ] A ^= (3 ^ 5);
199 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 12:19:48 ] 1001 1000 0000 0001 0011 0010 0110 0100 0101 0111
200 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 12:21:58 ] ヾ / < 仮面ライダー555が> ,. -ヤ'''カー、 /Y⌒Y⌒Y⌒Y⌒Yヾ ー―ァ /r⌒|:::|⌒ヾ _ノ オ{( |0| )} オオオォォォォ!!!!! __,ヽ,ヾ,_|V|,_ノ、/ ,r-,,= ,゛==ゝ_ViV_ノ~i/ 〃 `ー―-、 / /⌒`//´⌒c/^^^ )))))))))) ,,―イ {ー''"~{ {~゛`ー`/'`'~/ー--―' )) ,./ゝ_/∧ゝ_ノ ノ ー''" |ロ ロ | 人,_,人,_,人,_,人,_,人,_, <適当な番号をゲット!!>
201 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 15:08:21 ] あまり適当な番号には見えない件について
202 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 16:12:03 ] 0xC8
203 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 16:43:42 ] 丁度256円になります。
204 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 16:47:10 ] ポイントはお付きしますか?
205 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 16:50:33 ] いいえ、彼はペンです。
206 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 02:12:41 ] char v; if(v){ ..... } vのビット列が [10000000] と [00000001] ではやっぱり前者の方が早いんだろうか
207 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 02:21:08 ] 最適化や前後のループや分岐予測によるだろ…常識的に考えて…
208 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 02:37:55 ] 嫌な答え方だな
209 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 03:18:03 ] 感じないわ。
210 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 03:39:36 ] 痛くないわ。
211 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 11:01:09 ] 五寸釘はイヤだろ・・・・常考
212 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 11:21:15 ] ごっすんごっすん五寸釘ー
213 名前:デフォルトの名無しさん mailto:sage [2007/05/05(土) 12:16:52 ] そっちかよクソ
214 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 17:55:55 ] あいーん
215 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 21:23:54 ] 効率的では無いけど少々トリッキーなJavaのコード。数列の解説は面倒なので略。 float[] p = { 0.000f, 0.000f, 1.000f, 5.373f, 0.000f, 0.998f, 4.989f, 0.000f, 1.075f, 5.000f, 0.000f, 0.000f, 0.000f, 5.373f, 0.998f, 4.865f, 4.865f, 0.951f, 4.970f, 2.370f, 1.160f, 5.000f, 1.326f, 0.000f, 0.000f, 4.989f, 1.075f, 2.370f, 4.970f, 1.160f, 3.700f, 3.700f, 0.179f, 4.473f, 2.598f, 0.000f, 0.000f, 5.000f, 0.000f, 1.326f, 5.000f, 0.000f, 2.598f, 4.473f, 0.000f, 3.536f, 3.536f, 0.000f, }; float[] q = new float[384]; int i,j,k; for(i=0;i<8;i++) { k = (((i>>>2 )^(i>>>1 )^i)&1)*12; for(j=0;j<16;j++) { q[i*48+j*3+0] = ((i&1)==0)?p[(j^k)*3+0]:-p[(j^k)*3+0]; q[i*48+j*3+1] = ((i&2)==0)?p[(j^k)*3+1]:-p[(j^k)*3+1]; q[i*48+j*3+2] = ((i&4)==0)?p[(j^k)*3+2]:-p[(j^k)*3+2]; }} for(i=0;i<32;i++) { for(j=0;j<12;j++) { System.out.printf("%+6.3ff,",q[i*12+j]); } System.out.print("\n"); }
216 名前:215の出力結果(1/2) mailto:sage [2007/05/14(月) 21:26:12 ] +0.000f,+0.000f,+1.000f,+5.373f,+0.000f,+0.998f,+4.989f,+0.000f,+1.075f,+5.000f,+0.000f,+0.000f, +0.000f,+5.373f,+0.998f,+4.865f,+4.865f,+0.951f,+4.970f,+2.370f,+1.160f,+5.000f,+1.326f,+0.000f, +0.000f,+4.989f,+1.075f,+2.370f,+4.970f,+1.160f,+3.700f,+3.700f,+0.179f,+4.473f,+2.598f,+0.000f, +0.000f,+5.000f,+0.000f,+1.326f,+5.000f,+0.000f,+2.598f,+4.473f,+0.000f,+3.536f,+3.536f,+0.000f, -0.000f,+5.000f,+0.000f,-1.326f,+5.000f,+0.000f,-2.598f,+4.473f,+0.000f,-3.536f,+3.536f,+0.000f, -0.000f,+4.989f,+1.075f,-2.370f,+4.970f,+1.160f,-3.700f,+3.700f,+0.179f,-4.473f,+2.598f,+0.000f, -0.000f,+5.373f,+0.998f,-4.865f,+4.865f,+0.951f,-4.970f,+2.370f,+1.160f,-5.000f,+1.326f,+0.000f, -0.000f,+0.000f,+1.000f,-5.373f,+0.000f,+0.998f,-4.989f,+0.000f,+1.075f,-5.000f,+0.000f,+0.000f, +0.000f,-5.000f,+0.000f,+1.326f,-5.000f,+0.000f,+2.598f,-4.473f,+0.000f,+3.536f,-3.536f,+0.000f, +0.000f,-4.989f,+1.075f,+2.370f,-4.970f,+1.160f,+3.700f,-3.700f,+0.179f,+4.473f,-2.598f,+0.000f, +0.000f,-5.373f,+0.998f,+4.865f,-4.865f,+0.951f,+4.970f,-2.370f,+1.160f,+5.000f,-1.326f,+0.000f, +0.000f,-0.000f,+1.000f,+5.373f,-0.000f,+0.998f,+4.989f,-0.000f,+1.075f,+5.000f,-0.000f,+0.000f, -0.000f,-0.000f,+1.000f,-5.373f,-0.000f,+0.998f,-4.989f,-0.000f,+1.075f,-5.000f,-0.000f,+0.000f, -0.000f,-5.373f,+0.998f,-4.865f,-4.865f,+0.951f,-4.970f,-2.370f,+1.160f,-5.000f,-1.326f,+0.000f, -0.000f,-4.989f,+1.075f,-2.370f,-4.970f,+1.160f,-3.700f,-3.700f,+0.179f,-4.473f,-2.598f,+0.000f, -0.000f,-5.000f,+0.000f,-1.326f,-5.000f,+0.000f,-2.598f,-4.473f,+0.000f,-3.536f,-3.536f,+0.000f,
217 名前:215の出力結果(2/2) mailto:sage [2007/05/14(月) 21:27:16 ] +0.000f,+5.000f,-0.000f,+1.326f,+5.000f,-0.000f,+2.598f,+4.473f,-0.000f,+3.536f,+3.536f,-0.000f, +0.000f,+4.989f,-1.075f,+2.370f,+4.970f,-1.160f,+3.700f,+3.700f,-0.179f,+4.473f,+2.598f,-0.000f, +0.000f,+5.373f,-0.998f,+4.865f,+4.865f,-0.951f,+4.970f,+2.370f,-1.160f,+5.000f,+1.326f,-0.000f, +0.000f,+0.000f,-1.000f,+5.373f,+0.000f,-0.998f,+4.989f,+0.000f,-1.075f,+5.000f,+0.000f,-0.000f, -0.000f,+0.000f,-1.000f,-5.373f,+0.000f,-0.998f,-4.989f,+0.000f,-1.075f,-5.000f,+0.000f,-0.000f, -0.000f,+5.373f,-0.998f,-4.865f,+4.865f,-0.951f,-4.970f,+2.370f,-1.160f,-5.000f,+1.326f,-0.000f, -0.000f,+4.989f,-1.075f,-2.370f,+4.970f,-1.160f,-3.700f,+3.700f,-0.179f,-4.473f,+2.598f,-0.000f, -0.000f,+5.000f,-0.000f,-1.326f,+5.000f,-0.000f,-2.598f,+4.473f,-0.000f,-3.536f,+3.536f,-0.000f, +0.000f,-0.000f,-1.000f,+5.373f,-0.000f,-0.998f,+4.989f,-0.000f,-1.075f,+5.000f,-0.000f,-0.000f, +0.000f,-5.373f,-0.998f,+4.865f,-4.865f,-0.951f,+4.970f,-2.370f,-1.160f,+5.000f,-1.326f,-0.000f, +0.000f,-4.989f,-1.075f,+2.370f,-4.970f,-1.160f,+3.700f,-3.700f,-0.179f,+4.473f,-2.598f,-0.000f, +0.000f,-5.000f,-0.000f,+1.326f,-5.000f,-0.000f,+2.598f,-4.473f,-0.000f,+3.536f,-3.536f,-0.000f, -0.000f,-5.000f,-0.000f,-1.326f,-5.000f,-0.000f,-2.598f,-4.473f,-0.000f,-3.536f,-3.536f,-0.000f, -0.000f,-4.989f,-1.075f,-2.370f,-4.970f,-1.160f,-3.700f,-3.700f,-0.179f,-4.473f,-2.598f,-0.000f, -0.000f,-5.373f,-0.998f,-4.865f,-4.865f,-0.951f,-4.970f,-2.370f,-1.160f,-5.000f,-1.326f,-0.000f, -0.000f,-0.000f,-1.000f,-5.373f,-0.000f,-0.998f,-4.989f,-0.000f,-1.075f,-5.000f,-0.000f,-0.000f,
218 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 21:53:43 ] 誰かエスパーしてくれ
219 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 23:11:47 ] 新手の荒らしだろ、スルーよろ。
220 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 00:22:46 ] k = (((i>>>2 )^(i>>>1 )^i)&1)*12; は k = ((i>>>2 )&4)*12; と等価じゃない?
221 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 00:24:00 ] k = (((i>>>2 )^(i>>>1 )^i)&1)*12; は k = ((i>>>2 )&1)*12; と等価
222 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 00:25:45 ] おいおい、不等号3つって……
223 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 00:56:43 ] System.out.printfって何だよ オブジェクト指向すげえよ
224 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 02:01:14 ] >>>220-221 ^は排他的論理和、>>>は符号無し右シフト、&は論理積なので、 k=(((i>>>2 )^(i>>>1 )^i)&1)*12はi=1,2,4,7の時にk=12、i=0,3,5,6の時にk=0となる。 全然等価じゃねーぞ。
225 名前:215 mailto:sage [2007/05/15(火) 03:58:02 ] エスパー困難なコードですが、一番意図の分かりにくい部分だけ解説。 k = (((i>>>2 )^(i>>>1 )^i)&1)*12; 上の文は、iのパリティがevenであればk=0、oddであればk=12とする処理を行う部分ですが iの値域が0〜7に限られるため、パリティの計算は下3bitに対してのみ行っています。 k = (Integer.bitCount(i)&1)*12; とする手もありますが、今回は先のように書きました。 p[0]〜p[15]を4x4の行列と見た場合に、q[]にその値をコピーする for(j=0;j<16;j++) { q[j] = p[j^k]; } の処理はkの値によって以下のような振る舞いの変化をします。 k=0:そのまま、k=3:列を逆順に入れ替え、k=12:行を逆順、k=15:行・列ともに逆順
226 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 04:07:12 ] そこまで式が込み入ってたら、テーブルの方が速くないかな。 まあ、環境によるとは思うが。
227 名前:デフォルトの名無しさん [2007/05/20(日) 08:13:37 ] あげ
228 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 07:41:36 ] ある変数の中でビットが必ず一つだけ立っているとき そのビットの位置(左右どちらからでもよい)を求めたいのですが ↓のNTZやNLZを求めるアルゴリズムを使うのよりも高速にできませんか? www.nminoru.jp/~nminoru/programming/bitcount.html 立っているビットの数が一つという条件があるので 何か工夫できないか考えたんですけど思いつきません。
229 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 08:06:11 ] どっかで聞いたような質問だな・・・
230 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 08:07:19 ] memcpyよりも高速にコピーできる高速memcpyを作りたいのですが 何か参考になる方法ってありますか?
231 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 08:18:56 ] >>230 memcpyより高速な手法が存在するとしたら、世の中のmemcpyはその高速 な手法を使うんじゃない?
232 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 08:24:56 ] >>230 ビット単位で転送するという話でもない限り、スレ違い。
233 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 08:26:58 ] >>231 いいえ。
234 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 08:31:37 ] 前スレのログってどこかにある?
235 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 08:35:42 ] あ、あったあった。 p2.chbox.jp/read.php?host=pc8.2ch.net&bbs=tech&key=1123918075&ls=all ここの377に似たような質問があるね。
236 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 08:39:30 ] >>228 ビット位置を持って回ることを検討したか? >>230 つ [ゼロコピー]
237 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 09:05:14 ] ビット位置を持って回るのは難しいと思いました。 ビットはこんな風に複数のビットが立ってる変数から取り出してます。 UInt32 bits; ... while(bits) { UInt32 bit = bits&(-bits); UInt32 bit_position = get_bit_position(bit); ... } で、このget_bit_position()の部分を作りたいのですが・・
238 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 09:12:52 ] ちょっと>>235 を読んできます
239 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 10:16:01 ] とりあえず>>235 の430でやってみます。 みなさんありがとうございました。
240 名前:デフォルトの名無しさん [2007/05/23(水) 15:19:02 ] 24xx32〜24xx512 までのシリアルEE-PROMというのは pageというのを持っていてページサイズ内なら一度に書き込みが出来ます ページサイズは8〜256まで2のべき乗で、ROMタイプによって異なります。 今、EE_write(adr , size, dt[] ) という関数があって、この関数はページサイズを認識しません。 そこでこのラッパを作りたいのです pagesize, ADR, SIZE , *p if( (ADR ^ (ADR + SIZE -1)) & (0xFFFFu-(pagesize-1) ) ){ 一度に書ける } 分割しなければいけない場合 ADR 〜 (ADR | (pagesize-1) ) が最初に書く領域 というふうに考えたのだけど、ループが格好良く書けないの。
241 名前:デフォルトの名無しさん mailto:sage [2007/05/23(水) 16:43:01 ] 自己レス 結局こうやった while(( (ADR ^ (ADR+SIZE-1)) & (0xFFFFU-(pagesize-1)) ) ){ ct = (ADR | (pagesize-1))+1 -ADR; EE_write(ADR, ct , p); p += ct; ADR += ct; SIZE -= ct; } EE_write(ADR, SIZE , p );
242 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 05:19:07 ] 格好良いかどうかは主観だという良い例。
243 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:20:07 ] >>241 普通に書くとこんな感じ? unsigned tail = adr + size; unsigned ct = pagesize - adr % pagesize; while (adr + ct < tail) { EE_write(adr, ct, dt); dt += ct; adr += ct; ct = pagesize } if ((ct = tail - adr) != 0) EE_write(adr, ct, dt); >>241 って、SIZEに 0 を指定されると大変なことになりそうだな。
244 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 15:33:15 ] 汚いJavaコードコンテストの会場はこちらですか?
245 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 15:35:13 ] いいえ、ここはJavaを知らない244が居るスレです。
246 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 22:25:32 ] 面白くない 失せろ
247 名前:デフォルトの名無しさん [2007/05/27(日) 23:15:48 ] エンディアンの変換を共用体でやるのってどうやるんですか?
248 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 23:26:39 ] バイトオーダーは詳しくないが int, int って並びなら、 1, 2, 3, 4, 5, 6, 7, 8 が 4, 3, 2, 1, 8, 7, 6, 5 ってなるだけで 8, 7, 6, 5, 4, 3, 2, 1 にはならないのでは?
249 名前:・∀・)っ-○◎● mailto:sage [2007/05/27(日) 23:31:17 ] こうですかわかりません>< typedef union { uint32_t wd; uint8_t bt[4]; } HogeType; HogeType a, b; a.wd = src; b.bt[0] = a.bt[3]; b.bt[1] = a.bt[2]; b.bt[2] = a.bt[1]; b.bt[3] = a.bt[0]; dest = b.wd;
250 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 00:21:29 ] ヤツはダンゴさんじゃない
251 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 00:52:56 ] 共用体って、本当はそういう風に使っちゃダメなんだよな。 規格違反。 まあ、そう使えないコンパイラはないと思うけど。
252 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 08:09:58 ] おいおい共用体をそういう風に使わずにほかにどんな用途があるって言うんだアホかw