[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 20:05 / Filesize : 206 KB / Number-of Response : 960
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【高速化】ビット演算 0x02



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






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<206KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef