【関数化】ビット演算 0x03
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2008/11/08(土) 20:32:00【高速化】ビット演算 0x02
http://pc11.2ch.net/test/read.cgi/tech/1158367586/
過去スレ
0x01. http://pc8.2ch.net/test/read.cgi/tech/1123918075/
関連スレ
アセンブラ… (゜□゜) ↑アッー!↓
http://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
0002デフォルトの名無しさん
2008/11/08(土) 21:17:08bitの逆転ってどんなコード組んだら一番速い?
int rev(int n){n=(n<<16)|(n>>16);
n=((n&0x00ff00ff)<<8)|((n&0xff00ff00)>>8);
n=((n&0x0f0f0f0f)<<4)|((n&0xf0f0f0f0)>>4);
n=((n&0x33333333)<<2)|((n&0xcccccccc)>>2);
return((n&0x55555555)<<1)|((n&0xaaaaaaaa)>>1);}
より速いのがありそうな気がしてならない
0003デフォルトの名無しさん
2008/11/08(土) 21:42:008ビット分のテーブルがあるとして
return
table[ n & 0xff ] << 24
| table [ (n >> 8) & 0xff ] << 16
| table [ (n >> 16) & 0xff ] << 8
| table [ (n >> 24) & 0xff ] ;
0004デフォルトの名無しさん
2008/11/08(土) 23:20:46とりあえず命令の並列度を高めてみた。
unsigned rev(unsigned n){
n = (n<<24) |(n<<8&0x00FF0000) | (n>>8&0x0000FF00) |(n >> 24);
n = (n<<6&0xC0C0C0C0) | (n<<2&0x30303030) | (n>>2&0x0C0C0C0C) | (n>>6&0x03030303);
n = (n<<1&0xAAAAAAAA) | (n>>1&0x55555555);
return n;
}
0005デフォルトの名無しさん
2008/11/10(月) 21:12:230006デフォルトの名無しさん
2008/11/10(月) 22:13:250007デフォルトの名無しさん
2008/11/11(火) 01:29:170008デフォルトの名無しさん
2008/11/11(火) 10:25:570009デフォルトの名無しさん
2008/11/11(火) 13:33:270010デフォルトの名無しさん
2008/11/11(火) 19:48:410011デフォルトの名無しさん
2008/11/11(火) 20:25:26斜めビットボードもありか?
持ち駒は、どう表現すんのかわかんね。
0012デフォルトの名無しさん
2008/11/12(水) 16:56:20ビットボードにする必要はない
0013デフォルトの名無しさん
2008/11/13(木) 21:33:03この文はもっと縮まないですか?
0014,,・´∀`・,,)っ-●◎○
2008/11/13(木) 21:46:15Intelを前提にするならなぜ_bswap()を使わない
0015デフォルトの名無しさん
2008/11/13(木) 21:52:470016,,・´∀`・,,)っ-●◎○
2008/11/13(木) 21:54:17if(hr==DIERR_INPUTLOST||hr==DIERR_NOTACQUIRED)
0017って書けるようにならんもんか
2008/11/13(木) 22:04:500018,,・´∀`・,,)っ-●◎○
2008/11/13(木) 22:07:3532ビット即値を命令レベルでサポートするのってx86くらいしかないんだよね
定数ロードのオーバーヘッドがかる。
PPCなんかだと16ビットずつならロードできるんだけど。
0019,,・´∀`・,,)っ-●◎○
2008/11/13(木) 22:10:40MSに頼めよ
各エラーを表現するビットが独立してるならこれでいけるんだけどな
if(hr & (DIERR_INPUTLOST | DIERR_NOTACQUIRED))
0020デフォルトの名無しさん
2008/11/13(木) 22:11:12switch(hr) {
case DIERR_INPUTLOST:
case DIERR_NOTACQUIRED:
}
だが、ifで書くのより格段に長くなるのと、DIERR_... が整数のときしか
使えない。
0021,,・´∀`・,,)っ-●◎○
2008/11/13(木) 22:22:48#define EQUAL_OR2(X, N1, N2) (((X) == (N1)) || ((X) == (N2)))
0022デフォルトの名無しさん
2008/11/14(金) 23:05:27組込みなら幾らでもあるぞ
有名どころでH8とかTLCS900とか
0023デフォルトの名無しさん
2008/12/08(月) 00:02:320024捕手
2008/12/28(日) 20:16:06static inline charT xorcmp(const charT *s, charT d0, charT d1) {
return (s[0]^d0) | (s[1]^d1);
}
template <typename charT>
static inline charT xorcmp(const charT *s, charT d0, charT d1, charT d2) {
return (s[0]^d0) | (s[1]^d1) | (s[2]^d2);
}
template <typename charT>
static inline charT xorcmp(const charT *s, charT d0, charT d1, charT d2, charT d3) {
return (s[0]^d0) | (s[1]^d1) | (s[2]^d2) | (s[3]^d3);
}
template <typename charT>
static inline charT xorcmp2(const charT *s, const charT *d) {
return xorcmp(s, d[0], d[1]);
}
template <typename charT>
static inline charT xorcmp3(const charT *s, const charT *d) {
return xorcmp(s, d[0], d[1], d[2]);
}
template <typename charT>
static inline charT xorcmp4(const charT *s, const charT *d) {
return xorcmp(s, d[0], d[1], d[2], d[3]);
}
0025もひとつ捕手
2008/12/28(日) 20:28:34struct Flags {
intT value;
intT get(intT mask) const { return value & mask; }
void set(intT mask) { value |= mask; }
void reset(intT mask) { value &= ~mask; }
void assign(intT mask, intT/*bool*/ cond) {
cond = -(cond != 0);
value = (value | (mask & cond)) & (~mask | cond);
}
};
0026デフォルトの名無しさん
2009/01/03(土) 15:46:49もっと短くする方法がありましたら教えてください。
(引数のhには16進文字しか入ってきません)
unsigned char ascii2hex(unsigned char h) {
if (h <= '9') {
h -= '0';
} else {
if (h > 'F') {
h -= 0x20;
}
h -= 'A' - 10;
}
return h;
}
0027デフォルトの名無しさん
2009/01/03(土) 16:31:08ソースなら
unsigned char ascii2hex(unsigned char h) {
return h - (h <= '9' ? '0' : (h <= 'F' ? 'A' - 10 : 'a' - 10));
}
実行文なら
unsigned char ascii2hex(unsigned char h) {
static const unsigned char *const t = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,
0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,10,11,12,13,14,15
};
return t[h];
}
0028デフォルトの名無しさん
2009/01/03(土) 18:10:41大きなテーブル使うとかは無理です。
すいません。
0029デフォルトの名無しさん
2009/01/03(土) 18:17:420030デフォルトの名無しさん
2009/01/03(土) 18:19:120031デフォルトの名無しさん
2009/01/03(土) 18:21:030032デフォルトの名無しさん
2009/01/03(土) 18:30:37分岐と配列なしで値を返せるとは思うが計算時間の方が掛かる。
0033デフォルトの名無しさん
2009/01/03(土) 18:32:330034デフォルトの名無しさん
2009/01/03(土) 18:33:21それとも別?
0035デフォルトの名無しさん
2009/01/03(土) 18:39:15なら、>>26 もしくは >>27 の上側でいいと思う。
(今時のコンパイラなら、ほぼ似たようなコードを吐くはず。)
それ以上を期待するなら、アセンブリコード出して手で最適化。
ただ、最適化する余地はそんなにないと思う。
0036デフォルトの名無しさん
2009/01/03(土) 18:42:180037デフォルトの名無しさん
2009/01/03(土) 18:55:240038デフォルトの名無しさん
2009/01/03(土) 18:58:550039デフォルトの名無しさん
2009/01/03(土) 20:59:05static unsigned char table[] = {0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15,};
return table[(h & ~0x20) - '0'];
速度無視すりゃこっちの方がコードサイズ短くなるかもな。
static char a[2];
a[0] = h;
return strtol(a, NULL, 16);
0040デフォルトの名無しさん
2009/01/03(土) 21:10:10h &= ~0x20;
h -= (h > '9') * ('A'-('9'+1));
return h - '0';
乗算があるけど7倍ならコンパイラがよろしくやってくれるだろ。
0041デフォルトの名無しさん
2009/01/03(土) 22:50:29とはいえAVRは使ったこと無いからどうすれば速いかよく分からんけど。
unsigned char d;
h &= 0x1F;
d = (h>>4|h<<4);//swap 命令使ってほしいなっと
d = d-1 & 9;
h = h+d & 0xF;
return h;
0042デフォルトの名無しさん
2009/01/03(土) 22:58:53return (h & ~48) % 55;
004341
2009/01/03(土) 23:26:34unsigned char d = (h >> 4 | h << 4);
d = (d&1)-1 & 9;
h = h+d & 0xF;
>>42
除算がサポートされてても速度が微妙じゃね?
でも格好良いなそれ。
0044デフォルトの名無しさん
2009/01/03(土) 23:29:00まあ除算できないから無理なんだけどね・・・。
0045デフォルトの名無しさん
2009/01/03(土) 23:48:54AVRには乗除算命令は一部のモデルにしかなく、
ない場合はコンパイラが適当に変換するようになっています。
>>40は>>28と全く同じコードサイズでした。
>>43が1ワード減って、最も小さくなりました。
>>39は上記に比べて50バイト程増えました。
strtol等ライブラリ関数は一応用意されてますが、
リンクするとサイズがとんでもないことになるので使えません。
>>42の割り算は、内部ルーチンが大きいため
テーブルを使うのとと同程度でした。
0046デフォルトの名無しさん
2009/01/03(土) 23:49:448a 33 cpi r24, 0x3A ; 58
28 f0 brcs .+10
87 34 cpi r24, 0x47 ; 71
08 f0 brcs .+2
80 52 subi r24, 0x20 ; 32
87 53 subi r24, 0x37 ; 55
08 95 ret
80 53 subi r24, 0x30 ; 48
08 95 ret
>>40の出力コード
8f 7d andi r24, 0xDF ; 223
8a 33 cpi r24, 0x3A ; 58
10 f4 brcc .+4
90 e0 ldi r25, 0x00 ; 0
01 c0 rjmp .+2
97 e0 ldi r25, 0x07 ; 7
80 53 subi r24, 0x30 ; 48
89 1b sub r24, r25
08 95 ret
>>43の出力コ−ド
98 2f mov r25, r24
82 95 swap r24
81 70 andi r24, 0x01 ; 1
81 50 subi r24, 0x01 ; 1
89 70 andi r24, 0x09 ; 9
89 0f add r24, r25
8f 70 andi r24, 0x0F ; 15
08 95 ret
きちんとスワップされました
0047デフォルトの名無しさん
2009/01/03(土) 23:59:04unsigned char e = (d << 4 | d >> 4);
return (9 & ~e) + (h & 15);
これでどうだ?
0048デフォルトの名無しさん
2009/01/04(日) 00:05:2413ワードになってしましました。
28 2f mov r18, r24
20 54 subi r18, 0x40 ; 64
92 2f mov r25, r18
92 95 swap r25
9f 70 andi r25, 0x0F ; 15
22 95 swap r18
20 7f andi r18, 0xF0 ; 240
92 2b or r25, r18
90 95 com r25
99 70 andi r25, 0x09 ; 9
8f 70 andi r24, 0x0F ; 15
89 0f add r24, r25
08 95 ret
0049デフォルトの名無しさん
2009/01/04(日) 00:11:070050デフォルトの名無しさん
2009/01/04(日) 00:35:44eori さえあれば・・・。
0051デフォルトの名無しさん
2009/01/04(日) 01:00:01乗算自体なくなって0か7になるのか。
かしこいな。
0052デフォルトの名無しさん
2009/01/04(日) 09:42:34if (h > '9') h -= 7;
return h & 0xF;
これを分岐無しにするともっと長くなりそうだが。
int n = (h > '9');
h += n;
n <<= 3;
h -= n;
return h & 0xF;
0053デフォルトの名無しさん
2009/01/04(日) 12:41:25cpi, brvs, subi, andi, ret
の5命令でいけそうだ。
分岐なしの方は 1 ビットシフトしかないのでかなり長くなるはず。
0054デフォルトの名無しさん
2009/01/04(日) 21:44:08>>52
unsigned char ascii2hex(unsigned char h) {
h &= ~0x20;
if (h > '9') h -= 7;
return h & 0xF;
}
として、6ワードになりました。
8f 7d andi r24, 0xDF ; 223
8a 33 cpi r24, 0x3A ; 58
08 f0 brcs .+2
87 50 subi r24, 0x07 ; 7
8f 70 andi r24, 0x0F ; 15
08 95 ret
すばらしいです。
0055デフォルトの名無しさん
2009/01/04(日) 22:50:410056デフォルトの名無しさん
2009/01/04(日) 23:43:33むかーし、Z80のプログラムを逆アセンブルしてたら
同じように16進ASCII2桁を数値に直すサブルーチンがあって
正確には覚えてないが
push af
a >>= 4
call half
pop af
half:
以下1桁分の計算
ret
のような感じの、半再帰的な造りに感動した覚えがある。
0057デフォルトの名無しさん
2009/01/04(日) 23:46:02まあとにかく、サブルーチン内のわずか先を一度callするやり方、ってことで。
0058デフォルトの名無しさん
2009/01/05(月) 00:56:37DAAだかDADだかのBCD演算用の命令を使って、キャリーをうまく使って
分岐無しにしたような気がした。
どこか探せばあるかもね。
0059デフォルトの名無しさん
2009/01/05(月) 19:16:065ワードの間違いでした。
>>56
試しに再帰で作ってみました。
unsigned char htoi(unsigned char h, unsigned char l);
2桁の16進文字を値にする関数をこのように宣言すると、
AVRの場合h はr24、 l はr22に入り、戻り値はr24になります。
Cから呼ばれる関数はr0,r18〜r27,r30,r31が破壊を気にせず使えます。
htoi: // 半再帰を使ってみる→ 11ワード
mov r23, r24 // tmp <= h
ldi r24, 0 // 戻り値を0へ初期化
rcall half // 相対コール(tmpの処理)
swap r24 // ニブルを交換
mov r23, r22 // tmp <= l
half: cpi r23, 0x3A ; 58
brcs .+2
subi r23, 0x07 ; 7
andi r23, 0x0F ; 15
or r24, r23 // 結果をr24へor
ret
0060デフォルトの名無しさん
2009/01/05(月) 19:17:38cpi r24, 0x3A ; 58
brcs .+2
subi r24, 0x07 ; 7
cpi r22, 0x3A ; 58
brcs .+2
subi r22, 0x07 ; 7
andi r22, 0x0F ; 15
swap r24
andi r24, 0xF0 ; 240
or r24, r22
ret
ワード数的には変わりませんでした。
movとかldiが無駄のような、必要なような。
0061デフォルトの名無しさん
2009/01/06(火) 01:24:17しかし分岐使うほうにまだ1命令負けてるのがなぁ
unsigned char d;
h = h + 0x41 & 0x9F;
d = (h >> 4) | (h << 4);
h = h - d & 0xF;
return h;
0062デフォルトの名無しさん
2009/01/27(火) 21:18:440063デフォルトの名無しさん
2009/02/21(土) 23:38:220064デフォルトの名無しさん
2009/02/26(木) 16:00:28ビットのうちで、最下位のビット番号を
求める方法はありますか?
0x00000010 → 1
0x00100000 → 5
みたいな。
1のビット数は任意がいいですけど、
高速なら1ビット限定でもかまいません。
0065デフォルトの名無しさん
2009/02/26(木) 16:22:20x に入ってるとすると、x ^ (x - 1) とか x & (x ^ (x - 1)) とか、
最下位の立ってるビット関係の値を取り出せる演算はあるけど、
ビット位置がうまく出てくる方法はないんじゃないかな。
0066デフォルトの名無しさん
2009/02/26(木) 16:32:150067デフォルトの名無しさん
2009/02/26(木) 16:46:490068デフォルトの名無しさん
2009/02/26(木) 17:25:410069デフォルトの名無しさん
2009/02/26(木) 20:58:20あと、CPUによっては命令を持っていることもある。x86のbsfみたいに。
0070デフォルトの名無しさん
2009/02/26(木) 21:45:260071デフォルトの名無しさん
2009/02/26(木) 21:47:50まぁx&-xで最下位ビット抽出してからやればなんとかなるかも
int f(unsigned x){
x = x & -x;
//x = (x * 0x0722BED3) >> 27; // 64ビット乗算がないならこっち
x = (x * (0x0722BED3ULL<<5)) >> 32 & 31;
return "\0\1\13\2\10\14\34\3\11\32\15\17\35\27\4\21\37\12\7\33\31\16\26\20\36\6\30\25\5\24\23\22"[x];
}
0072デフォルトの名無しさん
2009/02/26(木) 22:58:470073デフォルトの名無しさん
2009/02/27(金) 00:03:32なんでそんなのがわかるの?
天才ですか?
俺にはさっぱり・・・
returnで返しているのも何をしているのかわからん・・・
何かお勧めの本はありますか?
体育大学卒で組込みやってるあんぽんたんですが、
本を読む努力はします。
0074デフォルトの名無しさん
2009/02/27(金) 00:33:06こう書くから判りにくいんだよ。
こう書き直したらどうだ?w
return x["\0\1\13\2\10\14\34\3\11\32\15\17\35\27\4\21\37\12\7\33\31\16\26\20\36\6\30\25\5\24\23\22"];
ギャグはさておき。
static const char table[] = {
0, 1, 11, 2, 8, 12, 28, 3,
9, 26, 13, 15, 29, 23, 4, 17,
31, 10, 7, 27, 25, 14, 22, 16,
30, 6, 24, 21, 5, 20, 19, 18
};
return table[x];
と同じだよ。
0075デフォルトの名無しさん
2009/02/27(金) 00:33:45みたいな書き方、
自分で積極的に使う必要は無いが
読めるようになっておく必要はあると思うぞ。
0076デフォルトの名無しさん
2009/02/27(金) 07:28:190077デフォルトの名無しさん
2009/02/27(金) 07:32:13同じじゃないだろ
char配列の終端に冗長な0が必要だ
0078デフォルトの名無しさん
2009/02/27(金) 08:06:470079デフォルトの名無しさん
2009/02/27(金) 10:14:24組込み系か。
とりあえず「ハッカーのたのしみ」読んどけ。
あと、先輩や同業者が、計算機科学や情報系をバカにするかもしれないが、
話半分に聞いておくこと。
0080デフォルトの名無しさん
2009/02/27(金) 12:27:36文法周りはみんなが言ってくれたから計算回りだけ。
とりあえず前スレに分かりやすく書いてた人が居たから引用
前スレとの違いはp=5になった事ぐらい
ここから引用
周期2^p-1ビットの列があって、そこからpビットを切り出すと、オール0以外の全てのパターンが現れる
p=3の場合のM系列は例えばこう。
0011101
↓ (周期2^3-1=7で同じパターンの繰り返し)
001110100111010011101...
上の桁から3ビットを切り出すと、
001 (1)
_011 (3)
__111 (7)
___110 (6)
____101 (5)
_____010 (2)
______100 (4)
1〜7まで全部出るだろ。これに000だけ追加すればおk。
これだけだと順番がバラバラなので、テーブルと組み合わせる。
↓この文字列リテラルの部分な。
"xxxxxxx"[(ハッシュ計算式)]
すると、>>762-763になりますよ、と。ビット溢れによるマスクなども組み合わせているが。
0081デフォルトの名無しさん
2009/02/28(土) 08:23:45同じじゃない
実行時のメモリが1バイト冗長だ
0082デフォルトの名無しさん
2009/02/28(土) 08:37:370083デフォルトの名無しさん
2009/02/28(土) 08:42:160084デフォルトの名無しさん
2009/02/28(土) 09:03:180085デフォルトの名無しさん
2009/02/28(土) 09:47:380086デフォルトの名無しさん
2009/02/28(土) 10:08:470087デフォルトの名無しさん
2009/02/28(土) 10:13:310088デフォルトの名無しさん
2009/02/28(土) 13:51:09シフトしてって数えるとか、浮動小数点フォーマット変換でとかあるけどあまりスマートな方法がないよね。
0089デフォルトの名無しさん
2009/02/28(土) 14:14:26DSPとかだとビット並びを反転させる命令があるから、それと組み合わせるか。
0090デフォルトの名無しさん
2009/02/28(土) 16:03:400091デフォルトの名無しさん
2009/02/28(土) 16:42:35体育大学で組込みは希少だよな。日本全国探してもレア?
0093デフォルトの名無しさん
2009/03/08(日) 10:14:520094デフォルトの名無しさん
2009/03/13(金) 05:58:26お願いします。
0095デフォルトの名無しさん
2009/03/13(金) 06:05:160096デフォルトの名無しさん
2009/03/20(金) 21:41:48例えば32bit符号付き整数の絶対値を求める式を、定理を使って単純に変形するだけで、
andとかshiftとかmulみたいな単純な操作のみで構成された式に変形できる公理系とかそういうの
x < 0 ? -x : x
={なんか、分岐の融合法則とかそういうの}
(n ^ (n >> 31)) - (n >> 31)
こういう等式変換の形でアルゴリズムを計算でできれば、
勘だけではできないときに色々と役立つんじゃないかなーと思うだけど
つーか絶対ある筈なんだけど、俺はそういう噂すら知らないんで
0097デフォルトの名無しさん
2009/03/20(金) 22:39:46ビット演算で絶対値を求めたいなら、2の補数を調べるといい。
2進数とか16進数を難しいと思ってるかもしれないが、他の人は誰も
そう思ってないから。
009896
2009/03/21(土) 00:45:51={ 2の補数 : -n = ~n + 1 }
n < 0 ? ~n+1 : n
={ n+0 = n }
n < 0 ? ~n+1 : n+0
={ --x = x, - 0 = 0 }
n < 0 ? ~n-(-1) : n - 0
={ n < 0 ? -1 : 0 <=> (n>>31) …(*}
(n < 0 ? ~n : n) - (n >>31)
={ ~n = n^(-1), n^0 = n}
(n < 0 ? n^(-1) : n^0) - (n >>31)
={ (*) }
(n^(n>>31)) - (n>>31)
? : 演算子の単調性とか一部証明無しで決め打ちしてますができました
4番目の変形以降は知ってないとできませんね、恐らく常識なんでしょうけど
>>96はその常識をまとめてあったり、こういう演算の性質について
群とかそういった代数学の概念での議論とかが載ってる文献などありませんかという意味でした
0099デフォルトの名無しさん
2009/03/25(水) 04:25:32(n^-(n>>31))+(n>>31)
かな?
nが1の補数だったらどうなるんだろう
0100デフォルトの名無しさん
2009/03/25(水) 04:27:42n<0?~n:n
→n<0?n^-1:n^0
→n^(n>>31)
かな。
0101デフォルトの名無しさん
2009/03/25(水) 04:38:12x<y?z:w
→x-y<0?z:w
→z&(x-y>>31)|w&(~(x-y>>31))
x<=y?z:w
→y<x?w:z
x>y?z:w
→y<x?z:w
x>=y?z:w
→x<y?w:z
x=y?z:w
→x-y=0?z:w
→x-y<0&y-x<0?w:z
→w&((x-y>>31)&(y-x>>31))|z&(~((x-y>>31)&(y-x>>31)))
0102デフォルトの名無しさん
2009/03/25(水) 04:39:43→y+(z&(x>>31))
0103デフォルトの名無しさん
2009/03/25(水) 05:50:180104デフォルトの名無しさん
2009/03/26(木) 18:53:33他で4クロック以上重くなるというのでなければビットシフトまで落とす意味は十分にある。
0105デフォルトの名無しさん
2009/03/26(木) 19:34:120106,,・´∀`・,,)っ-○◎●
2009/03/26(木) 19:37:54y + ((x < 0)? 0 : z)に変形すれば
mov eax, dword ptr [y]
mov edx, dword ptr [x]
xor ecx, ecx
cmp eax, 0
cmovae ecx, dword ptr [z]
add eax, ecx
0107,,・´∀`・,,)っ-○◎●
2009/03/26(木) 19:45:46y + srl(x, 31) * z
0108デフォルトの名無しさん
2009/03/26(木) 20:08:02cmov系はフラグが確定するまで待機するから。
0110,,・´∀`・,,)っ-○◎●
2009/03/26(木) 20:17:24movd xmm0, dword ptr [y]
movd xmm1, dword ptr [x]
pxor xmm2, xmm2
movd xmm4, dword ptr [z]
pcmpgtd xmm2, xmm0
pand xmm2, xmm3
paddd xmm0, xmm2
movd eax, xmm0
どうみてもネタです。本当にありがとうございました。
0111デフォルトの名無しさん
2009/04/18(土) 06:06:040112デフォルトの名無しさん
2009/04/28(火) 19:50:170113ほしゅ
2009/05/15(金) 16:34:500114,,・´∀`・,,)っ-○○○
2009/05/15(金) 20:53:010115デフォルトの名無しさん
2009/05/15(金) 22:00:470116デフォルトの名無しさん
2009/05/17(日) 23:45:35それに人間が答えてるけどさ、
一般的に反復深化の自動計算でビット演算はじき出すフリーソフトとかないんだっけ?
0117デフォルトの名無しさん
2009/05/17(日) 23:49:360118,,・´∀`・,,)っ-○○○
2009/05/18(月) 00:15:38てかその手のは社内ツールであったな。
0119,,・´∀`・,,)っ-○○○
2009/05/18(月) 00:17:550120デフォルトの名無しさん
2009/05/19(火) 02:55:160121,,・´∀`・,,)っ-○○○
2009/05/19(火) 03:53:50BCDって64ビットで無効命令だぜ?
Core 2あたりで除算回路そのものが高速化されてるあたり、IDIVと同じようなことやってんだろ
0122デフォルトの名無しさん
2009/05/24(日) 21:17:290123デフォルトの名無しさん
2009/05/29(金) 06:15:50c = INVERSE(a);
d = INVERSE(b);
e = c + d;
f = INVERSE(e);
このようにaとbからfを求める処理があるとき
INVERSEを無くしたり減らしたりはできるでしょうか
0124,,・´∀`・,,)っ-○○○
2009/05/29(金) 07:25:25大ヒント
a + b
= (a & b) + ((a ^ b) << 1)
0125デフォルトの名無しさん
2009/05/31(日) 10:10:12do {
unsigned c=x&y;
x^=y; y=c>>1;
} while(c!=0);
return x;
}
0126,,・´∀`・,,)っ-○○○
2009/05/31(日) 10:47:550127デフォルトの名無しさん
2009/06/06(土) 18:55:12a+b = (a^b) + ((a&b)<<1)
の間違い?
0128,,・´∀`・,,)っ-○○○
2009/06/12(金) 01:37:04そーでしたorz
0129デフォルトの名無しさん
2009/06/20(土) 16:18:05C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
953 名前:デフォルトの名無しさん 投稿日:2009/06/13(土) 22:32
>>952
例えば、32bit符号無し整数の変数があり、
先頭から8bitごとにARGBを表しているとする。
(32bit画像の1画素)
すると例えば、値を使用する前に2つを分離しなければならないから、
以下のようにする。
a = (x >> 24);
r = 0xFF & (x >> 16);
g = 0xFF & (x >> 8);
b = 0xFF & x;
a = *((unsigned char *)&c+3);
以下略。
0131デフォルトの名無しさん
2009/06/21(日) 00:01:180133デフォルトの名無しさん
2009/06/30(火) 01:49:31本質的に難しいね
通常の加算の出力の MSB が入力の全ビットに依存するところを
加算命令が全部1命令でやってるわけで、
その左右反転の LSB が入力の全ビットに依存するような演算はバラすと結構かかる。
反転と再反転やりながら同時に加算もする方法を考えてみたけど
結局加算をバラすしかなくてだめだった。
(c & 0xAAAAAAAA)+(d & 0xAAAAAAAA) とかいろいろ考えたんだが。
逆演算の減算命令使うかなあと思ったけど、それも結局
「MSB が他のすべてのビットに影響を与える力」しかないし、
LSB に対する計算力が全くない。
結局やってることも補数の足し算だしね。
残るは特定係数の乗算?
それでもやっぱり基本的に LSB が上位ビットに無視されちゃう構造だし…。
なんか出力の LSB が入力の複数の上位ビットに依存するような便利な命令ないっすか?
右シフトくらいしか思いつかない…
0134133
2009/06/30(火) 03:39:263による除算命令を使って何かできないか?
b = a/3 の演算は次のような演算とみてよい。
c = a[MSB]; //逆キャリー
for(i=MSB-1;i<LSB;i--){ // 以下はいわゆる「筆算」による除算
b[i] = (c<<1 & a[i]) >= 3;
c = (c<<1 & a[i]) % 3;
}
一方加算 b = a0 + a1 は次の通り。
c = 0;
for(i=LSB;i<MSB;i++){
b[i] = a0[i]^a1[i]^c;
c = a0[i]&a1[i] | a0[i]&c | a1[i]&c;
}
結構構造が似てる気がするのだが。
それでいて a/3 は LSB へ向かって結果が伝搬し、下位からの影響はない。
a/3 が1入力演算なので2入力演算な左右反転加算にはまだ遠いが…
なにか道が開けるかもしれない。
0136デフォルトの名無しさん
2009/07/01(水) 13:27:12難しい
無理な気がする
0137デフォルトの名無しさん
2009/07/01(水) 20:33:21inverseせずに出来てるじゃないか
0138デフォルトの名無しさん
2009/07/01(水) 20:50:37無視してないよ
コードも実行してみたよ
>>125よりいいのを考えてて思いつかなかった
0139デフォルトの名無しさん
2009/07/02(木) 02:33:25ちょっと最悪計算量が大きくない?
0x00000001 = reverse_add(0x80000000, 0xFFFFFFFE) とか。
64ビットとかだったら64回くらいループしそうだし。
0140デフォルトの名無しさん
2009/07/05(日) 21:53:38そんなソフトあるんか・・・ 世界は広いな
0141デフォルトの名無しさん
2009/07/06(月) 18:55:030142デフォルトの名無しさん
2009/07/06(月) 19:20:070143デフォルトの名無しさん
2009/07/06(月) 19:54:130144デフォルトの名無しさん
2009/07/06(月) 20:01:13{
}
0145デフォルトの名無しさん
2009/07/06(月) 20:58:51nを60にしても1なんですけどー
0146デフォルトの名無しさん
2009/07/07(火) 03:43:18%は言語によって MOD とかもある。
0147デフォルトの名無しさん
2009/07/07(火) 04:08:05このスレの住人にも不可能なの?
0148,,・´∀`・,,)っ-○○○
2009/07/07(火) 20:47:14if ((n & 3) || (n % 60))
0149デフォルトの名無しさん
2009/07/08(水) 00:49:59の時だけ割り算か。1/4になったね。
4の倍数に注目したらもうちょっとなんとかならない?
0150デフォルトの名無しさん
2009/07/08(水) 00:52:29if(n & 3) return 0;
x=((n>>2)*0x01111111)>>12;
return !x || x==0xf;
まあ掛け算で桁あふれのない n<16444 どまりだけどね。
0152デフォルトの名無しさん
2009/07/08(水) 02:54:490153デフォルトの名無しさん
2009/07/08(水) 03:00:32ttp://www.nicovideo.jp/watch/sm5910890
ニコ動も馬鹿に出来んな・・・これをベースに展開してみた。
const unsigned int m18=(1<<18)-1;
const unsigned int m10=(1<<10)-1;
const unsigned int m6=(1<<6)-1;
n=((n>>18)<<2)+(n&m18);
n=((n>>10)<<2)+(n&m10);
n=((n>>6)<<2)+(n&m6);
int cal_res=((n)!=(0xff&("\xF0\xB4\x78\x3C"[((n>>2)&3)+4-((((n+0xff))&0x100)>>6)])))?0:1;
//int cal_res=((n)!=(0xff&("\x00\x00\x00\x00\xF0\xB4\x78\x3C"[(n>>2)&7])))?0:1;
//またはswitchやif-elseなど
パイプラインが浅いCPUや乗除命令をサポートするCPUでは微妙かもな。
まだ最適化できる気がするが飽きた。
0154153
2009/07/08(水) 03:19:13まぁこっちもビット数の制限がゆるいって利点はあるか
>>150-151
定数での乗算を加算とビットシフトで置き換える操作はコンパイラ任せってことでしょうか
0155デフォルトの名無しさん
2009/07/09(木) 03:09:01もっと小さくならないでしょうか?
8bitのマイコン(AVR)用なので、大きなテーブルを使ったり
除算したりは無しでお願いします。掛け算は可です。
関数の戻りは、関数で入れた文字列の次のポインタを返してますが、
最後にヌル文字を入れたり1〜3の値を返すなど、次の位置が判れば
変更してもいいです。
char *itoa_next(unsigned char n, char *buf) {
uint8_t c, len;
if (n >= 100) {
n -= 100;
c = '1';
if (n >= 100) {
n -= 100;
c++;
}
*buf++ = c;
len = 1;
} else {
len = 0;
}
for (c = 0; n >= 10 && c < 9; c++, n-=10) { }
if (c || len) {
*buf++ = c + '0';
}
*buf++ = n + '0';
return buf;
}
0156デフォルトの名無しさん
2009/07/09(木) 03:40:25小さくしたいなら、百の位からforループで回すべき。早くしたいなら、百の位を処理した後の
forループは1,2回しか回らないのだから、ifのがいい。bufの頭は呼び出し側で知っている
のだから、そこを返すのはムダだと思う。呼び出し側で役に立つ情報:文字列長を返すとか、
末尾nullをつけてc標準の文字列にしておいたほうがいい。
0157デフォルトの名無しさん
2009/07/09(木) 09:59:43char *itoa_next(unsigned char n, char * const buf) {
unsigned char * p = buf;
const unsigned char dec_columns[3] = {100,10,1};
const int tbllen = sizeof(dec_columns)/sizeof(dec_columns[0]);
int col;
/*不要桁スキップ*/
for(col=0;col<tbllen-1;col++){
if(n>=dec_columns[col])
break;
}
/*存在する桁から出力開始*/
for(;col<tbllen-1;col++){
const unsigned char column = dec_columns[col];
*p = 0x30;
while(n>=column){
(*p)++;
n-=column;
}
p++;
}
*p++ = n | 0x30;
return p;
}
0158デフォルトの名無しさん
2009/07/09(木) 21:50:370159デフォルトの名無しさん
2009/07/11(土) 17:59:06x86でeaxにn>>2が入っているとして
(n>>2)*0x01111111
をちょっと手動で最適化してみてるんだけど、誰か8クロック未満になった人居る?
0160デフォルトの名無しさん
2009/07/12(日) 01:22:15クロック計測はもうムリゲじゃ・・・?
0161154
2009/07/12(日) 01:47:25>>150-151の部分を最適化してるんだよな?
n>>=2;
x=(n+(n<<4));
n=(n<<24)+(x<<16)+(x<<8)+x;
x=(n>>12 & 0xf);
自分はこれが精一杯で、命令数調べるのが面倒だったからコンパイルしたら吹いたwww
最適化切るとregister指定に関係なくスタック使うわ、最適化すると乗算命令に戻るわww
乗算の展開は乗除命令を持たないCPUでないとあんまり意味が無いって示唆なのかね?
>>154で加算とビットシフトで置き換えって書きましたが、逆効果かもしれませんゴメンナサイ。
0162154
2009/07/12(日) 02:36:34const unsigned int m18=(1<<18)-1;
const unsigned int m10=(1<<10)-1;
const unsigned int m6=(1<<6)-1;
n=((n>>18)<<2)+(n&m18);
n=((n>>10)<<2)+(n&m10);
n=((n>>6)<<2)+(n&m6);
n=((n>>6)<<2)+(n&m6);
return ((((n^0x3C)+0xFF)^(n+0xFF))&0x100)?1:0;
0163デフォルトの名無しさん
2009/07/12(日) 15:41:36可読性は馬鹿みたいに低下するよね。
ビット演算を使うことで可読性があがって保守性が高まるいい例ってあるかな。
0164デフォルトの名無しさん
2009/07/12(日) 15:59:570165デフォルトの名無しさん
2009/07/13(月) 01:06:27X=(X+3)&~3;
0166デフォルトの名無しさん
2009/07/13(月) 01:12:550167デフォルトの名無しさん
2009/07/13(月) 04:13:17いっぱいありすぎて書けない
0168デフォルトの名無しさん
2009/07/13(月) 07:59:560169デフォルトの名無しさん
2009/07/13(月) 08:37:160170デフォルトの名無しさん
2009/07/13(月) 08:47:360171デフォルトの名無しさん
2009/07/13(月) 09:21:090172デフォルトの名無しさん
2009/07/13(月) 20:39:25浸透圧がでてこないから
0173デフォルトの名無しさん
2009/07/13(月) 21:12:18書いてもいいですよ
0174デフォルトの名無しさん
2009/07/13(月) 23:46:1830で引いていって、30で引けなくなったらそれが余りです
0175デフォルトの名無しさん
2009/07/14(火) 01:02:1230進数表記に変換したときの一の位の数字をみる
0176デフォルトの名無しさん
2009/07/14(火) 02:29:170177デフォルトの名無しさん
2009/07/14(火) 03:45:31データベース使って部品展開とか組むのにメモリ48KBとか52KBだもん。
>>174
無限ループだね。
0179デフォルトの名無しさん
2009/07/14(火) 12:16:26the art of computer programming
ハッカーのたのしみ
Intel/AMDの最適化マニュアル
以外だと
0180デフォルトの名無しさん
2009/07/14(火) 21:29:50とかじゃないか?
俺はmasm.exeとlink.exeとxda.exeで勉強したけど。
0181デフォルトの名無しさん
2009/07/14(火) 21:39:11関係あるとしたら伝播遅延を含んだ論理回路設計の章があるけど
練習問題でもリップルキャリー加算器を作るまでで
ビット処理のテクニック的なことはほとんど出てこない
ただ、5章は未読なので知らん
0182デフォルトの名無しさん
2009/07/14(火) 22:16:150183デフォルトの名無しさん
2009/07/14(火) 22:22:110184デフォルトの名無しさん
2009/07/14(火) 22:23:41256倍シリーズとか。エキスパートCプログラミングとか。
0185デフォルトの名無しさん
2009/07/14(火) 22:54:40無かったと思う。やはり昔のアセンブリメインの時代に習得したのか?
0186デフォルトの名無しさん
2009/07/14(火) 23:33:260187デフォルトの名無しさん
2009/07/15(水) 00:32:09例として2を代入したんだが、気づいてくれよ・・・
X=(X+(pow(2,N)-1))&~(pow(2,N)-1);
BMP形式の1ラインのバイト数求める時に良く使う
0188デフォルトの名無しさん
2009/07/15(水) 00:34:38解析魔法少女美咲ちゃんマジカルオープン!
http://www.amazon.co.jp/exec/obidos/ASIN/4798008532
Windowsプロフェッショナルゲームプログラミング2
http://www.amazon.co.jp/exec/obidos/ASIN/4798006033
…何か?
ええどーせ二次オタのゲーム好きですよ…
0189デフォルトの名無しさん
2009/07/15(水) 11:38:16高度(?)なビット演算の技は出てこない。
0190デフォルトの名無しさん
2009/07/15(水) 14:39:510191デフォルトの名無しさん
2009/07/15(水) 18:50:51あの頃だと、下手にビット演算するよりも、
如何に効率の良いテーブル参照をできるかが勝負だった気がする。
0192デフォルトの名無しさん
2009/07/16(木) 10:42:270193デフォルトの名無しさん
2009/07/16(木) 19:00:25つか、ペナルティだらけだったな。
今から考えると。
0194,,・´∀`・,,)っ-○○○
2009/07/17(金) 23:26:58やぱ、へるみ氏の掲示板じゃね?
0195デフォルトの名無しさん
2009/07/30(木) 00:38:12if((mul(x,0xEEEEEEEF) < 0x11111111) & (x&3==0)){
//割り切れる
}else{
//割り切れない
}
ここで mul(x,y) 命令は x*y の下位 32 bit
ハッカーのたのしみに載ってた
0196デフォルトの名無しさん
2009/07/30(木) 02:26:430197デフォルトの名無しさん
2009/07/30(木) 12:38:510198デフォルトの名無しさん
2009/07/30(木) 13:26:350199,,・´∀`・,,)っ-○○○
2009/07/30(木) 20:51:57>>195
x86だとこんな感じかな。悪くない。
jnz c1else
mov edx, 3
mul edx, EEEEEEEFh
cmp edx, 111111111h
jl c1else
;; 割り切れる
jmp c1end
c1else:
;; 割り切れない
c1end:
0200,,・´∀`・,,)っ-○○○
2009/07/30(木) 20:52:410201デフォルトの名無しさん
2009/07/30(木) 22:53:380202,,・´∀`・,,)っ-○○○
2009/07/30(木) 23:00:01test eax, 3
jnz c1else
mov edx, eax
mul edx, EEEEEEEFh
cmp edx, 111111111h
jl c1else
;; 割り切れる
jmp c1end
c1else:
;; 割り切れない
c1end:
>>201
刺身の上にタンポポを(ry
じゃなくて基本はPHPやRubyなんかの高級言語使い
たまにバイナリ操作用にC/C++なんかでライブラリを書いたりもする
0203デフォルトの名無しさん
2009/07/30(木) 23:05:11元質問者の>>141は既に居ない可能性が。
0204,,・´∀`・,,)っ-○○○
2009/07/30(木) 23:11:340205デフォルトの名無しさん
2009/07/30(木) 23:14:51なるほど。それは才能の無駄使いのような。
昔はローレベルなことをやってたとか?
0206デフォルトの名無しさん
2009/07/30(木) 23:20:150207,,・´∀`・,,)っ-○○○
2009/07/31(金) 18:19:15転職考えてた時期に本名で問い合わせたらシカトされたんで見る目がない会社ってことだけはわかった。
0208デフォルトの名無しさん
2009/07/31(金) 18:58:48扱いたいのですが、簡単に分離する方法はあるでしょうか。
80 40 80 40 80 80 40 40というバイト列がきたら、
0〜5は 00000000b
6 は 01010011b
7 は 10101100b
という感じに抽出したいのです。
1つのバイトに対して8回ループするしかないでしょうか。
int i;
unsigned char buf[BUFSIZE];
for (i = 0; i < BUFSIZE; i++) {
unsigned char pos, bit;
unsigned char byte = buf[i]; // バイト列
for (pos = 8, bit = 0x80; pos; bit>>=1) {
pos--;
stream[pos] <<= 1;
if (byte & bit) {
stream[pos] |= 1;
}
}
}
0209,,・´∀`・,,)っ-○○○
2009/07/31(金) 19:05:540210デフォルトの名無しさん
2009/07/31(金) 19:06:10if文の存在が分からない。
単純に元のビットをシフトしながら8本分合成していけばいいんでないの?
0211,,・´∀`・,,)っ-○○◎
2009/07/31(金) 19:11:210212デフォルトの名無しさん
2009/07/31(金) 19:12:57x86系ではないので、汎用的な方法があれば
>>210
こういうことでしょうか?
int i;
unsigned char buf[BUFSIZE];
for (i = 0; i < BUFSIZE; i++) {
unsigned char pos;
unsigned char byte = buf[i]; // バイト列
for (pos = 0; pos < 8; pos++) {
stream[pos] <<= 1;
stream[pos] |= (byte & 1);
byte>>=1;
}
}
これ以上は無理でしょうか。
0213デフォルトの名無しさん
2009/07/31(金) 19:27:22http://www.hackersdelight.org/HDcode/transpose8.c
を見るとループを展開したりバイト列をlongにまとめたりするだけで
同じものみたいですね。
その本は面白そうなので買ってみます。
ありがとうございました。
0214デフォルトの名無しさん
2009/07/31(金) 19:27:22なんで1でアンド取るの?
0215デフォルトの名無しさん
2009/07/31(金) 19:48:11仰ってる事が判らないのですが、
streamに格納していくには両方シフトしないとだめですよね?
transpose8vnのようにしろということでしょうか。
int i;
unsigned char buf[BUFSIZE];
for (i = 0; i < BUFSIZE; i+=8) {
unsigned char *a = buf+i;
stream[0] = (a[0] & 128) | (a[1] & 128)/2 | (a[2] & 128)/4 | (a[3] & 128)/8 |
(a[4] & 128)/16 | (a[5] & 128)/32 | (a[6] & 128)/64 | (a[7] )/128;
stream[1] = (a[0] & 64)*2 | (a[1] & 64) | (a[2] & 64)/2 | (a[3] & 64)/4 |
(a[4] & 64)/8 | (a[5] & 64)/16 | (a[6] & 64)/32 | (a[7] & 64)/64;
stream[2] = (a[0] & 32)*4 | (a[1] & 32)*2 | (a[2] & 32) | (a[3] & 32)/2 |
(a[4] & 32)/4 | (a[5] & 32)/8 | (a[6] & 32)/16 | (a[7] & 32)/32;
stream[3] = (a[0] & 16)*8 | (a[1] & 16)*4 | (a[2] & 16)*2 | (a[3] & 16) |
(a[4] & 16)/2 | (a[5] & 16)/4 | (a[6] & 16)/8 | (a[7] & 16)/16;
stream[4] = (a[0] & 8)*16 | (a[1] & 8)*8 | (a[2] & 8)*4 | (a[3] & 8)*2 |
(a[4] & 8) | (a[5] & 8)/2 | (a[6] & 8)/4 | (a[7] & 8)/8;
stream[5] = (a[0] & 4)*32 | (a[1] & 4)*16 | (a[2] & 4)*8 | (a[3] & 4)*4 |
(a[4] & 4)*2 | (a[5] & 4) | (a[6] & 4)/2 | (a[7] & 4)/4;
stream[6] = (a[0] & 2)*64 | (a[1] & 2)*32 | (a[2] & 2)*16 | (a[3] & 2)*8 |
(a[4] & 2)*4 | (a[5] & 2)*2 | (a[6] & 2) | (a[7] & 2)/2;
stream[7] = (a[0] )*128| (a[1] & 1)*64 | (a[2] & 1)*32 | (a[3] & 1)*16|
(a[4] & 1)*8 | (a[5] & 1)*4 | (a[6] & 1)*2 | (a[7] & 1);
}
0216デフォルトの名無しさん
2009/07/31(金) 19:53:05最後はなんでるーぷするのって硫黄と思ってたのにw
0217デフォルトの名無しさん
2009/07/31(金) 19:53:350218デフォルトの名無しさん
2009/07/31(金) 19:58:36コード量と相談ですね。
ありがとうございました。
0219デフォルトの名無しさん
2009/07/31(金) 23:27:060220デフォルトの名無しさん
2009/07/31(金) 23:56:470221デフォルトの名無しさん
2009/08/01(土) 00:31:320222デフォルトの名無しさん
2009/08/01(土) 00:32:30ループと、展開
0223デフォルトの名無しさん
2009/08/01(土) 00:42:46「 計 測 し ろ 」
0224デフォルトの名無しさん
2009/08/01(土) 01:13:180225デフォルトの名無しさん
2009/08/01(土) 01:17:070226デフォルトの名無しさん
2009/08/01(土) 01:33:44実際に使う人が実際に使う環境で計測すりゃいいんだよ。
0227デフォルトの名無しさん
2009/08/01(土) 01:41:11CPU向けに分岐のヒントつける場合も有るんだっけ?
じゃなくてCPUと対象のアルゴリズムのほうが影響するかな。
ループの方が良くなる要因
・コードサイズが小さくなる
:CPUのキャッシュに収まらないほどの大規模なアルゴリズムで有効
・アドレッシングが単純
:演算単位が大きかったり、添字がアドレッシング能力ギリギリだった場合に有効
展開の方が良くなる要因
・ハザードコストが減る
:パイプラインが存在する場合に有効
・分岐条件の計算が数分の1に減る
:常に有効。分岐条件が複雑であるほど効果が高い
アドレッシングのコストは分岐条件やハザードコストで十分にペイ出来そうだし、最近のCPUのキャッシュで足りないほどの大規模な展開を要する事って少ないだろうことを考えれば、どのみち最近のPC事情なら展開の方がよさそうだけど。
0228デフォルトの名無しさん
2009/08/01(土) 01:50:51/ ゙̄ヽ′ ニ‐- 、\ \ ところがどっこい
Z´// ,ヘ.∧ ヽ \ヽ ゝ ヽ ‥‥‥‥
/, / ,リ vヘ lヽ\ヽヽ.| ノ 最新のPCじゃありません
/イル_-、ij~ ハにヽ,,\`| < ‥‥‥‥!
. N⌒ヽヽ // ̄リ:| l l | `)
ト、_e.〉u ' e_ ノノ |.l l | ∠. 現実です
|、< 、 ij _,¨、イ||ト、| ヽ ‥‥‥!
. |ドエエエ「-┴''´|.|L八 ノ -、 これが現実‥!
l.ヒ_ー-r-ー'スソ | l トゝ、.__ | ,. - 、
_,,. -‐ ''"トヽエエエエ!ゝ'´.イ i l;;;;:::::::::::`::ー/
ハ:::::::::::::::::::::| l\ー一_v~'´ j ,1;;;;;;:::::::::::::::::::
. /:::;l::::::::::::::::::::;W1;;;下、 /lル' !;;;;;;;;;::::::::::::::::
/:::::;;;l:::::::::::::::::;;;;;;;;;;;;;;;|: :X: : : : : |;;;;;;;;;;;;;;::::::::::::
/:::::;;;;;;|:::::::::::::::;;;;;;;;;;;;;;;;|/: : >、: : :|;;;;;;;;;;;;;;;:::::::::::
0229デフォルトの名無しさん
2009/08/01(土) 03:59:10コンパイラが適切に展開できないことが判ってから初めて人手で展開すればいい。
0230,,・´∀`・,,)っ-○○○
2009/08/01(土) 05:19:20テーブル使ったっていいんだぜ
出力先の配列が連続ならな
0231デフォルトの名無しさん
2009/08/01(土) 16:13:320232デフォルトの名無しさん
2009/08/01(土) 17:25:570233デフォルトの名無しさん
2009/08/01(土) 17:30:07ってのを格好よく書きたいんだけどうまくいかない。
0b10000000 で n=3 なら 0b11100000 にするみたいな感じで。
0234デフォルトの名無しさん
2009/08/01(土) 18:30:510235デフォルトの名無しさん
2009/08/02(日) 03:12:48ASMなら、論理シフトしかなくても、キャリーを立てておいてキャリーごとローテートで。
0236デフォルトの名無しさん
2009/08/02(日) 04:09:21符号付整数型の負値の算術右シフトの結果がどうなるか(符号をどう扱うか)は処理系定義なので、
それを仮定して依存するコードを書いてはいけない。
それ以前の話として、
シフトじゃなくてマスクを望んでいるように思える。
言葉からも例からも断定は出来ないが。
0237デフォルトの名無しさん
2009/08/02(日) 05:10:100xFFFFFFFE,0xFFFFFFFF } を用意して、x |= mask[n]; でいいじゃん。
0238デフォルトの名無しさん
2009/08/02(日) 05:14:140239デフォルトの名無しさん
2009/08/02(日) 11:27:54算術右シフトを使うときは
#if ((-1)>>1)!=0
#error
#endif
と書いてるよ
0240デフォルトの名無しさん
2009/08/02(日) 11:29:01#if ((-1)>>1)!=-1
#error
#endif
0241デフォルトの名無しさん
2009/08/02(日) 13:28:13か?
0243デフォルトの名無しさん
2009/08/02(日) 13:39:160245デフォルトの名無しさん
2009/08/02(日) 14:31:15AVRで考えてみる。
1〜7シフト計算量
1,2,3 シフト 1〜3クロック
4 ニブル交換、AND 2クロック
5,6,7 ニブル交換、AND、シフト 3〜5クロック
最大5、平均3クロック。
>>215を実装すると、
レジスタ←a[0] 2クロック
AND 1クロック
レジスタ←a[1] 2クロック
AND 1クロック
右シフト1回 1クロック
OR 1クロック
(略)
stream[0]←レジスタ 2クロック
ここまで53クロック、(アドレス計算除く)
これを8回で424クロック。
同条件でループ>>212は
レジスタ←buf[i] 2クロック
レジスタ←stream[pos] 2クロック
左シフト 1クロック
AND 1クロック
OR 1クロック
stream[pos]←レジスタ 2クロック
右シフト 1クロック
ここまで10クロック、これを8x8回繰り返すと640クロック。
実際は条件ジャンプ処理を加えるとさらに増える。
ループにすると1.5倍以上は掛かる。
0246デフォルトの名無しさん
2009/08/02(日) 14:57:25C←レジスタ 1
レジスタクリア 1
レジスタ←C 1
0247デフォルトの名無しさん
2009/08/02(日) 15:00:460249デフォルトの名無しさん
2009/08/02(日) 22:34:05ビット列の長さにも寄るけれど、それほど長い単位でなければ、簡単かつ見通しがいいのはテーブル参照だろう。
0250デフォルトの名無しさん
2009/08/02(日) 22:54:56メモリアクセスだけじゃなく、アドレス計算も入るわけで
例えばn=5から (1<<n)-1で下位4bitのマスクが整数演算だけで出せるわけだし
これを反転させたり、nを要求bit数に応じて細工するのも当然整数だし。
もちろん、アドレス計算も整数だけどね。
自由度は圧倒的にテーブルが有利だけど。
0251233
2009/08/03(月) 03:48:50符号をほしいところまでうにょ〜んと延ばしたら出来るかも! と
思ったんだス。
変な思考でごめん。
0252デフォルトの名無しさん
2009/08/03(月) 04:24:27つ簡単かつ見通しがいいのは
0253デフォルトの名無しさん
2009/08/03(月) 04:44:59算術シフト・・・
0254デフォルトの名無しさん
2009/08/03(月) 04:53:04このスレで(多数に)求められているのは、可読性を落としてでも1clock削ること。
0255デフォルトの名無しさん
2009/08/03(月) 08:29:25たとえば3ビットシフトと4ビットシフトで所要クロック数は変わりますか?
0256デフォルトの名無しさん
2009/08/03(月) 09:10:11例えば、8086や80286は変わる。
最近のプロセッサは
普通バレルシフタが載っているので、変わらない。
0257,,・´∀`・,,)っ-○○○
2009/08/03(月) 21:31:57add eax, eax
add eax, eax
add eax, eax
add eax, eax
0258デフォルトの名無しさん
2009/08/03(月) 22:32:130259,,・´∀`・,,)っ-○○○
2009/08/04(火) 07:32:09整数加減算は1クロックに2回実行出来てアホみたいに得意だがシフトが苦手。
0260デフォルトの名無しさん
2009/08/06(木) 14:38:22unsigned char *l = (unsigned char *)vl, *r = (unsigned char *)vr;
for (;len--;) {
unsigned char x = *l++;
unsigned char y = *r++;
if (x > y)
return 1;
else
if (x < y)
return -1;
}
return 0;
}
unsigned char比較の不一致で1と-1を返したいのですが、
もっと簡単にならなかったでしょうか?
(1、-1じゃなくても正負が戻ればいいです)
昔どこかで見たような気がしたので。
0261デフォルトの名無しさん
2009/08/06(木) 15:59:470ならループ
0262デフォルトの名無しさん
2009/08/06(木) 18:52:16ってのは、alignあってないとだめ?
0263デフォルトの名無しさん
2009/08/06(木) 19:08:09CPU、またはその設定による。
整数単位で処理するのなら、8バイト
単位のほうがより速いのでは。
0264デフォルトの名無しさん
2009/08/06(木) 19:35:03CPUに依存しそうな質問するなら使ってるCPUくらい書けよ
0265デフォルトの名無しさん
2009/08/07(金) 17:34:45CPUによっては跨いだ時点で例外が飛ぶ
0266デフォルトの名無しさん
2009/08/07(金) 19:02:290267,,・´∀`・,,)っ-○○○
2009/08/07(金) 19:40:450268デフォルトの名無しさん
2009/08/07(金) 19:41:01いまでもそうだが, ネイティブコンパイルする処理系…
car とか cadr とか elis とかのバイトコードなマシンは MSB 側に
tag 持ってるような気が…
0269デフォルトの名無しさん
2009/08/07(金) 20:21:31ここで言ってる話はマスクが必要ないということだろう。
0270デフォルトの名無しさん
2009/08/07(金) 22:23:10byte pointerのインクリメントってどうやってんの?
0271デフォルトの名無しさん
2009/08/07(金) 22:34:12(初代)68000マシンとかであったな。
0272デフォルトの名無しさん
2009/08/08(土) 14:14:00ARMでもアドレスはバイト単位なんだから、ポインタ計算時には気にしなくて良いよ。
メモリアクセスするときには下位ビットをマスクすればOK。
下位ビット値からマスクやシフトの計算して任意のバイトにアクセスする。
0273デフォルトの名無しさん
2009/08/08(土) 22:08:18えーと、何通りにすればいいんだ
4バイトだと9通り?
0274デフォルトの名無しさん
2009/09/15(火) 20:04:58どんなドキュンメントを参照するべきですか?
0275デフォルトの名無しさん
2009/09/15(火) 20:55:30カーニハン&リッチー
0276デフォルトの名無しさん
2009/09/16(水) 07:44:51本格的とか書いてあるから74シリーズのデータシートでも見せるべきなのかと思った
0277デフォルトの名無しさん
2009/09/16(水) 08:13:010278,,・´∀`・,,)っ-○○○
2009/09/19(土) 00:33:390279デフォルトの名無しさん
2009/09/21(月) 21:40:060280デフォルトの名無しさん
2009/10/18(日) 22:27:25だれかアドバイスくだしあ。
[問題]
81ビットのデータがある。
アプリケーション上の制約から81ビットのうち値が1になるビットは高々15個である。
このデータを情報の欠損なく64ビットに圧縮したい。
その際、圧縮伸長はなるべく高速なものが望ましい。
どのようなアルゴリズムがよいか。
0281280
2009/10/18(日) 22:41:00ちょっと微妙な表現ですが、どのビットも1になれるけど、
81ビット全体として見たとき同時に1になるのは高々15個と言う意味です。
0282デフォルトの名無しさん
2009/10/18(日) 23:56:132.16個カウントするか、1が出てきたら、個数を4bitで吐き出す
3.最後まで繰り返して81ビット端まで言ったら、残りは0でパディング
(1が高々15個なら0が連続する領域は、最悪でも16箇所なので)
戻すときは、
1.64ビットの先頭から、4ビット取り出す。
2.取り出した数分0を吐き出す。吐き出した個数が64超えたら終わり
2.1を吐き出す。4bit取り出して2.に戻る。
早い実装は誰かに任せた
0283デフォルトの名無しさん
2009/10/19(月) 00:03:030284デフォルトの名無しさん
2009/10/19(月) 00:13:03最悪80ビットになるな
0285デフォルトの名無しさん
2009/10/19(月) 00:14:271が出てきたら11を吐き出す、
01が出てきたら10を吐き出す、
00が出てきたら0を吐き出す。
これじゃだめかね。
0286デフォルトの名無しさん
2009/10/19(月) 00:31:080287280
2009/10/19(月) 00:35:48おお、仕様も満たすし速度的にも完璧です。
ありがとうございます。
余談になりますが、高々15個のところを高々16個に変えると
>>285でぎりぎりアウトのケースがあるみたいです。
組み合わせの数的には64ビットで16個収まるみたいですが
16個でも速いアルゴリズムはあるのか、ちょっと気になりますね。
0288デフォルトの名無しさん
2009/10/19(月) 00:47:32あいぢあはそれでいい
16個連続してたときの扱いにバグが有りそう
平均で連続するのは4個か5個だから16分割4bitだともったいない
huffmanとか出現頻度で長さが変わるコードにすれば
もっと圧縮できると思うけど
そのテーブルを81bitに含めるかどうかでも変わってくる
0289デフォルトの名無しさん
2009/10/19(月) 01:05:30よって、0を圧縮するのがよい?
0290デフォルトの名無しさん
2009/10/19(月) 04:55:001が出てきたら111を吐き出す、
01が出てきたら110を吐き出す、
001が出てきたら10を吐き出す、
000が出てきたら0を吐き出す。
0291デフォルトの名無しさん
2009/10/19(月) 08:53:4215個の場合すら未クリアで>>285に劣るようだけども
0292デフォルトの名無しさん
2009/10/19(月) 09:07:190293デフォルトの名無しさん
2009/10/19(月) 11:37:581が出てきたら10を吐き出す、
01が出てきたら110を吐き出す、
001が出てきたら1110を吐き出す、
0001が出てきたら1111を吐き出す、
0000が出てきたら0を吐き出す。
0294デフォルトの名無しさん
2009/10/19(月) 11:38:40要するに、ハフマン符号化?
0295デフォルトの名無しさん
2009/10/19(月) 11:49:00それ以外は逆にbit数殖えちゃうんだよもん
0296デフォルトの名無しさん
2009/10/19(月) 11:54:11(0001)^15 0^21
0297デフォルトの名無しさん
2009/10/19(月) 12:05:27(01)^15 0^66
0298デフォルトの名無しさん
2009/10/19(月) 12:07:300299デフォルトの名無しさん
2009/10/19(月) 17:58:001になるビットの最低個数は0?
圧縮の話はスレ違いな気もするけど、いま圧縮アルゴリズムを語るスレは無いのね。
0300デフォルトの名無しさん
2009/10/19(月) 19:53:31これって、数え上げ符号でいいんじゃないかな?
0301デフォルトの名無しさん
2009/10/19(月) 20:14:280302280
2009/10/19(月) 21:17:37当初の仕様では1になるビットの最低個数は0でしたが、
今は立ってるビットが極端に少ないときは32ビットまで絞ろうかなーとか思ってます。
よかったら32ビットで何個のビットまで対応できるかもアドバイスください。
0303デフォルトの名無しさん
2009/10/19(月) 21:26:070304デフォルトの名無しさん
2009/10/19(月) 21:44:10>>285については
1.仕様を満たしている。
2.ワンパスで速度もほぼ最速に近い
ということは理解できるし、32bitへの応用もある程度できると思いますが
どの圧縮方法が最善か?ということになるとどう考えればいいか難しいです。
0305デフォルトの名無しさん
2009/10/19(月) 22:06:590306デフォルトの名無しさん
2009/10/19(月) 22:29:54000 -> 0 3ビット毎 区切り 右の様に 変換(圧縮) 64ビットに満たない時は 0 で埋める
001 -> 100 81ビットなので 27組
010 -> 101 64ビットに収める為には
100 -> 110 1組に1が1個ある場合は無圧縮なので 64/3=21.33 最大21個まで1を許容
011 -> 11100 1組に1が2個ある場合は拡大なので 64/5=12.8 最大24個まで1を許容
101 -> 11101 :
110 -> 11110 81-64=17 /2=8.5 000 が最低 9組無いと駄目 27-9=18
111 -> 11111 もろもろ計算すると この方法では 最大18個まで1を許容する と思う
解凍方法
1.1ビット拾う ---> ア
2.ア が 0 なら 000 を吐き 5へ
ア が 1 なら 2ビット拾う ---> イ
3.イ が 00 なら 001 を吐き 5へ
イ が 01 なら 010 を吐き 5へ
イ が 10 なら 100 を吐き 5へ
イ が 11 なら 2ビット拾う ---> ウ
4.ウ が 00 なら 011 を吐き 5へ
ウ が 01 なら 101 を吐き 5へ
ウ が 10 なら 110 を吐き 5へ
ウ が 11 なら 111 を吐き 5へ
5.1へ 27組分やったら終り もしくは 1の出現をカウントし 最大数に達していたら終り
ハフマン符号化の亜種
0307280
2009/10/19(月) 23:23:20ありがとうございます。
圧縮時のワード長に3を選んだのもハフマン符号の考え方から導き出せるんでしょうか。
0308デフォルトの名無しさん
2009/10/19(月) 23:35:170309デフォルトの名無しさん
2009/10/19(月) 23:36:05というかハフマン符号化について調べてないよねきっと。
0310デフォルトの名無しさん
2009/10/19(月) 23:38:220311デフォルトの名無しさん
2009/10/19(月) 23:42:050312280
2009/10/19(月) 23:43:41アルファベットとその出現確率が与えられた時の符号化の説明がありました。
ワード長の選び方に巻してはそのページには特に記述がなかったので
それもハフマン符号の範疇なのかなと疑問を持ちました。
0313デフォルトの名無しさん
2009/10/19(月) 23:46:30001 -> 100
010 -> 101
100 -> 110
011 -> 11100 1組に1が2個ある場合は拡大なので 64/5=12.8 最大24個まで1を許容
101 -> 11101 :
110 -> 11110 81-64=17 /2=8.5 000 が最低 9組無いと駄目 27-9=18
111 -> 11111 もろもろ計算すると この方法では 最大18個まで1を許容する と思う
0314デフォルトの名無しさん
2009/10/19(月) 23:49:543bitごとにひとまとまりのデータと見立てた場合でかつ、上であるほど出現頻度が高い場合の符号化パターン
を書こうとしたら誤爆した。
圧縮率を高めたい→高々15個の制限を取り払い、可能な限り増やしたい
ということでなければ>>306ので十分だと思う。
出現頻度調べるコストが許容できるのかどうかわからんし。
0315280
2009/10/20(火) 00:07:13期待していた以上の回答がもらえました。
ありがとうございます。
32ビットへの圧縮だと8ビットを1ワードとするくらいのほうがいいですかね。
0が8個 -> 0
0が7個,1が1個 -> 10xxx
0が6個,1が2個 -> 110xxxxx
0が5個,1が3個 -> 1110xxxxxx
...
0316デフォルトの名無しさん
2009/10/20(火) 01:04:320317デフォルトの名無しさん
2009/10/20(火) 01:29:500318デフォルトの名無しさん
2009/10/20(火) 08:00:110319280
2009/10/20(火) 08:05:12組み合わせの数だけでいえば64ビットで20個まで詰められるみたいです。
私の用途としては>>306で十分なのですが、嘘を言ってしまったので訂正しておきます。
0320デフォルトの名無しさん
2009/10/20(火) 08:56:0232bitだと何個まで逝けるんだ?
0321デフォルトの名無しさん
2009/10/20(火) 18:26:450322デフォルトの名無しさん
2009/10/20(火) 18:37:250323デフォルトの名無しさん
2009/10/20(火) 20:41:3181Cx <= 2^32 を満たす x までじゃないかなぁ
0324デフォルトの名無しさん
2009/10/20(火) 21:26:36理論限界値はシャノンの定理で算出できるだろJK。
0325デフォルトの名無しさん
2009/10/21(水) 20:18:301が0個 81!/(0!81!)=1 1種 1が1個 81!/(1!80!)=81 1が2個 81!/(2!79!)=3240
1が3個 81!/(3!78!)=85320 1が4個 81!/(4!77!)=1663740 1が5個 81!/(5!76!)=25621596
1が6個 81!/(6!75!)=324540216 1が7個 81!/(7!74!)=3477216600 1が8個 81!/(8!73!)=32164253550
32ビット長 4294967296種の表現力
81ビット長データを31ビットに圧縮する場合 81ビットの内 1が最大 7 個までならば可能と推測できる
テーブル引き(辞書検索) なら 出来る が データ量と検索時間から実現は難しい と思われる
で 連続する 0を特定のビット列に置き変える方法を紹介しときます ハフマン符号化の亜種
元データを 0, 10, 11 の三つの状態に変えます 元データの 1は 11になります
あとは 連続する0の個数を 0, 10 を使って表現します
1:0 2:00 3:10 4:000 5:010 6:100
7:0000 8:0010 9:0100 10:1000 11:1010
12:00000 13:00010 14:00100 15:01000 16:10000 17:01010 18:10010 19:10100
20:000000 21:000010 22:000100 23:001000 24:010000 25:100000 26:001010
27:010010 28:100010 29:010100 30:100100 31:101000 32:101010
33:0000000 34:0000010 35:0000100 … … 77:00101010 78:01001010 79:10001010
80:01010010 81:10010010 82:10100010 83:01010100 … …
これで圧縮できるのは
データ長 81ビット その内 1になるビットは最大 4 個 までなら32ビット長にできます たぶん
解凍は
11 が来るか データの最後まで読んだかでビット列を取得
そのビット列の種類により0の個数を判断しその数分 0を吐く
11 は 1を吐く
0326デフォルトの名無しさん
2009/10/21(水) 20:26:030327デフォルトの名無しさん
2009/10/21(水) 20:38:18意味が通じればいい、まさに理系の鏡です
0329デフォルトの名無しさん
2009/10/21(水) 21:09:510330,,・´∀`・,,)っ-○◎○
2009/10/21(水) 21:27:230331デフォルトの名無しさん
2009/10/21(水) 21:32:320332デフォルトの名無しさん
2009/10/21(水) 23:58:410333デフォルトの名無しさん
2009/10/22(木) 01:15:36除数をy、商を10000a+1000b+100c+10d+eとする(問題より、b=7)。
(1) 一番下の段で2桁シフトしてるので、10の位d=0
(2) 7をかけて3桁、8か9をかけて4桁なので、除数yは112以上142以下
(3) 3桁の数から7yを引いて3桁、その下の段4桁の数からc*yを引いて2桁。
つまりc>7であるが、少なくとも9yは4桁にならないといけないがc*yは3桁なのでc=8
(4) (3)より、8yは3桁なのでyは112以上124以下
(5) e*yは4桁なのでe=9
(6) a*yは4桁なのでa=9。つまり商は97809
(7) あとは適当に、たとえば124*97809=12128316としてみる。
□にうめる数は、上の行から順に
97809/124,12128316/1116/968/868/1003/992/1116/1116
となり、条件を満たす。
0334デフォルトの名無しさん
2009/10/22(木) 02:51:540335デフォルトの名無しさん
2009/10/22(木) 03:00:18だんごってどれが目なの
0337デフォルトの名無しさん
2009/10/22(木) 03:06:04それ眉間のしわで・・が目だと思ってたわ。。。
0338デフォルトの名無しさん
2009/10/22(木) 03:23:580339デフォルトの名無しさん
2009/10/22(木) 11:13:420340デフォルトの名無しさん
2009/10/22(木) 15:09:030341デフォルトの名無しさん
2009/10/22(木) 15:11:110342デフォルトの名無しさん
2009/10/23(金) 01:11:37,,・´∀`・,,)っ-○◎○
明らかに・が目だろ。,,が頬だから・が頬というのはありえん。´は眉だよね?
0343デフォルトの名無しさん
2009/10/23(金) 01:59:17あぁん?俺のダンゴが食えねえってのか?
0344デフォルトの名無しさん
2009/10/23(金) 03:12:350346デフォルトの名無しさん
2009/10/23(金) 08:38:500347デフォルトの名無しさん
2009/10/23(金) 08:50:240348デフォルトの名無しさん
2009/10/24(土) 02:22:250349デフォルトの名無しさん
2009/10/24(土) 02:30:310350デフォルトの名無しさん
2009/10/24(土) 09:03:460351デフォルトの名無しさん
2009/10/24(土) 09:12:240352デフォルトの名無しさん
2009/10/24(土) 09:14:350353,,・´∀`・,,)っ-○○○
2009/10/24(土) 12:39:010354デフォルトの名無しさん
2009/10/24(土) 14:01:31このあたりを見てもそう思えるかな?
ttp://www.amy.hi-ho.ne.jp/okuhara/howtoj.htm
0355デフォルトの名無しさん
2009/10/24(土) 15:04:37ANDとifの羅列だよ。
0356デフォルトの名無しさん
2009/10/24(土) 15:15:010357デフォルトの名無しさん
2009/10/24(土) 15:22:47>>354
これに書いてる用途の場合はシフトもするね。
このメリットがあるのはオセロ特有だけど。
一般的にビットボードが使われるのは
盤面を変化させたり戻すのよりも盤面コピー&破棄が速いから。
>>356
オセロでは普通2ビットだよ。
0358デフォルトの名無しさん
2009/10/24(土) 15:45:540359デフォルトの名無しさん
2009/10/24(土) 15:52:050360デフォルトの名無しさん
2009/10/24(土) 18:31:220361デフォルトの名無しさん
2009/10/24(土) 19:07:390362デフォルトの名無しさん
2009/10/24(土) 19:17:140363,,・´∀`・,,)っ-○○○
2009/10/24(土) 19:19:490364デフォルトの名無しさん
2009/10/24(土) 19:22:200365,,・´∀`・,,)っ-○○○
2009/10/24(土) 19:27:390366デフォルトの名無しさん
2009/10/24(土) 19:37:542ビットに成るか3ビットに成るかの分かれ目はAIの有無
0367デフォルトの名無しさん
2009/10/24(土) 19:42:270368デフォルトの名無しさん
2009/10/24(土) 19:49:41掛ける7
0369デフォルトの名無しさん
2009/10/24(土) 19:56:38以前見たレスでは結構賢そうな印象だったけど。
別人なのかな。
0370デフォルトの名無しさん
2009/10/24(土) 21:01:140371,,・´∀`・,,)っ-○○○
2009/10/24(土) 21:04:040372デフォルトの名無しさん
2009/10/25(日) 08:03:00前からこんなんだよ。
知ったかぶりしたり大口を叩いたりして自分を不利な状況に追い込んでからの
ディベートを楽しむ人。
0373デフォルトの名無しさん
2009/10/25(日) 13:02:15ビット演算をまとめてライブラリ化したいと思うけど、
何をピックアップしたらいいのだろうか?
0374デフォルトの名無しさん
2009/10/25(日) 14:05:110375デフォルトの名無しさん
2009/10/25(日) 18:58:20変な汎用化をするくらいなら普通に書いてコンパイラに任せなよ
0376,,・´∀`・,,)っ-○○○
2009/10/25(日) 19:51:18やるとしたらアルゴリズムレベルでの再考が必要
>>373
http://bmagic.sourceforge.net/
0377デフォルトの名無しさん
2009/10/25(日) 20:19:00昔のGCCがアホすぎただけだろ?
0378,,・´∀`・,,)っ-○○○
2009/10/25(日) 20:23:340379デフォルトの名無しさん
2009/10/25(日) 22:26:510380デフォルトの名無しさん
2009/10/25(日) 22:33:320381デフォルトの名無しさん
2009/10/25(日) 22:37:500382デフォルトの名無しさん
2009/10/26(月) 09:21:180383デフォルトの名無しさん
2009/10/26(月) 17:46:10外人はビットボードに掛け算を持ち込んでくるからすごいよな
0384デフォルトの名無しさん
2009/10/26(月) 19:49:150385デフォルトの名無しさん
2009/10/26(月) 19:51:15それ何のための計算?
0386デフォルトの名無しさん
2009/10/26(月) 21:16:50だとttp://www.amy.hi-ho.ne.jp/okuhara/bitmob.c
のimullのことかな?チェスだと
ttp://chessprogramming.wikispaces.com/Sliding+Piece+Attacks
あたりかね?横方向だけじゃなく縦方向や斜め方向の連続したビットを切り出す感じかなぁ
0387,,・´∀`・,,)っ-○○○
2009/10/26(月) 22:56:56現行CPUではAtomでくらいしか役に立たないけど。
0388デフォルトの名無しさん
2009/10/26(月) 23:18:46今はもう冷めたのかな
これだけの腕があるのに勿体無い
0389デフォルトの名無しさん
2009/11/29(日) 19:13:26その imull は単純なビット数え上げの一部かな。
cf.http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
>The best method for counting bits in a 32-bit integer v is the following:
>v = v - ((v >> 1) & 0x55555555); // reuse input as temporary
>v = (v & 0x33333333) + ((v >> 2) & 0x33333333); // temp
>c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count
これそのまま?
0391デフォルトの名無しさん
2009/11/30(月) 09:52:330392デフォルトの名無しさん
2009/11/30(月) 10:31:40あとは vz のマクロで使う表記だと思ってたよ
0393デフォルトの名無しさん
2009/12/01(火) 01:08:140394デフォルトの名無しさん
2009/12/24(木) 03:03:00キャリーの逆ができる回路ってx86CPUに無いのかな?
x86以外ではこれができるCPUってある?
0395デフォルトの名無しさん
2009/12/24(木) 03:10:24幅が広がると気がするんだけどどうなんだろ
あんまり使い道ない?
0396,,・´∀`・,,)っ-○○○
2009/12/24(木) 04:27:11利用頻度の低い回路を実装することほど無駄なものは無いからな。
まあビット逆転なら高速化方法がいくつかあるが
0397デフォルトの名無しさん
2009/12/24(木) 21:22:36強いてよく使われる場を挙げるとなると
高速フーリエ変換 (FFT) のアドレスアクセスで
ビット逆転の1インクリメントが必要になるとこくらいかな。
0000→1000→0100→1100… のように。
これを多用する DSP チップなんかでは多分そういう演算器として実装されてると思うし、
RISC じゃあまり見当たらないかな。
(しかもこの場合アドレスアクセスに使うだけだから
A[0]→A[8]→A[4]→A[12]…というポインタの「先の値」が得られればいいだけだが)
>>123 は当時のタイミングから勝手に想像するに、
オセロの着手判定に使いたかったのではないかと思う。
http://science6.2ch.net/test/read.cgi/sim/1090548999/791-
ちょうどこっちのこの辺の流れで必要になってて、同時期は僕も探してたしね。
この応用範囲を「一般のビット演算での使い道」にまで広げて解釈するとなると、
「並列左端指定付き連続値右端探索」かな。
「Y で指定された複数の set bit に対して、
X の中の set bit が右方向に初めて途切れる場所が
set bit になるようなビット列 Z を求めよ。
(ただし Y は Y & ~X = 0 を満たすものになっているとする)」
ex.
X=000011110000111100001111000011110000
Y=000010000000010000000000000001100000
Z=000000001000000010000000000000001000
これが「左方向に初めて」なら、
Z = (X+Y) & (~Y) と非常に簡単になる。
また、これが「Y での左端指定なし」で全部抜きだすだけならそれはそれで
Z = ~X & (X>>1) と簡単になる。
まあこれがオセロ以外に必要になることは少ないかもしれないね。
0398,,・´∀`・,,)っ-○○○
2009/12/24(木) 23:18:080399デフォルトの名無しさん
2009/12/26(土) 02:54:550400,,・´∀`・,,)っ-○○○
2009/12/26(土) 10:20:350401デフォルトの名無しさん
2009/12/30(水) 02:25:57既存のCPUで満足なの?
0402デフォルトの名無しさん
2009/12/30(水) 04:42:590403デフォルトの名無しさん
2009/12/30(水) 08:45:18たとえばNios II、一般品だとクロックが500M出るのは御の字。
0404デフォルトの名無しさん
2009/12/30(水) 09:55:37FPGAはCPU使わずに演算した方が高速
0405,,・´∀`・,,)っ-○○○
2009/12/30(水) 11:49:39D = (A & B) | (B & C) | (C & A)
とかな
0406デフォルトの名無しさん
2010/01/02(土) 04:06:04if ( ( x + y ) < x ) {
...
}
今のところこれが一番速いのですが
0407デフォルトの名無しさん
2010/01/02(土) 04:33:19キャリー先読みの関係で順序入れ替え回路を挟まざるを得ないと思うけれど、そんなニッチな状況に特化した命令を用意するかどうか…
>>395
だってRISCが持て囃される時代ですもの。
0408,,・´∀`・,,)っ-○○○
2010/01/03(日) 15:46:51FPGAですらFull Adderとかのよく使う回路は固定機能化されてることが多いぞ
まあ利用頻度の低い命令に専用回路を持たないのはある意味正解ではあるのだけど。
Nehalemでpopcntが実装されたのだって意外なことだと思ってるくらいだ。
ちなみにウン千ビットになるとSSSE3を使ったソフトウェア実装の方が速い。
0409デフォルトの名無しさん
2010/01/03(日) 17:55:230410デフォルトの名無しさん
2010/01/03(日) 23:50:21普通これって投機的にコンパイルしてくれないんだっけ。
例えば、64 bit 加算を 32 bit 変数 {zH,zL}={xH,xL}+{yH,yL} を計算する時に
zL=xL+yL;
if(zL<yL){
zH=xH+yH;
zH++;
}else{
zH=xH+yH;
}
とすれば zH=xH+yH までは分岐の前にやってくれるとか。
0411デフォルトの名無しさん
2010/01/08(金) 10:51:26void add3(int xh, int xl, int yh, int yl, int * pzh, int * pzl){ int zh, zl;
zl = xl + yl;
if (zl < yl) {
zh = xh + yh;
++zh;
} else {
zh = xh + yh;
}
* pzh = zh; * pzl = zl;
}
を
_add3:
pushl %ebp
xorl %edx, %edx
movl %esp, %ebp
movl 20(%ebp), %eax
movl 12(%ebp), %ecx
addl %eax, %ecx
cmpl %eax, %ecx
movl 16(%ebp), %eax
setl %dl
addl 8(%ebp), %eax
addl %eax, %edx
movl 24(%ebp), %eax
movl %edx, (%eax)
movl 28(%ebp), %eax
movl %ecx, (%eax)
popl %ebp
ret
とコンパイルした。ちょっと微妙?
0412デフォルトの名無しさん
2010/01/10(日) 02:30:27zh = xh+yh+(zl<yl);
ってことか。割と頭いいな gcc。
0413デフォルトの名無しさん
2010/01/10(日) 05:53:08という比較はいらないの?
0414デフォルトの名無しさん
2010/01/10(日) 13:52:50X+Y<2^k ならば Z>=Y。
対偶をとって
Z<Y ならば X+Y>=2^k。
Z<Y さえ満たせば それで判定OK。
確かに Z<X だけでもよいけど、両方必要というわけでもない。
0415デフォルトの名無しさん
2010/01/10(日) 14:01:28「cmpl %eax, %ecx」で評価して「setl %dl」で評価結果に合わせてゼロまたは1をセットして「addl %eax, %edx」で加算してる。
つまりしっかりと比較してる。
SETccやCMOVccなんかは目立たないけどちゃんと条件みて動作してるからねー
ただ、ホントの所はADCでキャリーごと加算してもらうのが理想だと思うが…
(zl < xl)がxl+ylのキャリーと一致することを予測してもらうのは荷が重いんだろうな。
投機的云々は最適化されすぎて、投機的にやったつもりなのかそうするまでもなかったのか、これではよく分からない。
メモリアクセスを含む命令は意図的に分散されてしまうものだし…
しっかし、AT文法は個人的には読み辛くって嫌だな…
0416デフォルトの名無しさん
2010/01/10(日) 14:32:130417デフォルトの名無しさん
2010/01/10(日) 22:32:54ビットが全部0なら0、一つでも立っていたら1みたいな感じで。
無理ですかね?
0418デフォルトの名無しさん
2010/01/10(日) 22:56:180419デフォルトの名無しさん
2010/01/10(日) 23:00:12xorl %eax, %eax
setne %al
になったんで十分かと
0420デフォルトの名無しさん
2010/01/10(日) 23:11:48少し速くなりました。
なんか既視感を感じるなと思ったら大昔に自分でそのコードを
書いたのを思い出してしまいました。
どうも退化しているようです。
ありがとうございました。
0421デフォルトの名無しさん
2010/01/10(日) 23:20:520422,,・´∀`・,,)っ-○○○
2010/01/10(日) 23:49:17後続の条件フラグ更新命令の検出で演算をキャンセルすることで
でもSandy Bridgeでは両方同時にできるようになる。
具体的に言うとdec + jccもfusionできたりする。
0423デフォルトの名無しさん
2010/02/01(月) 12:20:57レジスタの初期値が0x001だった場合、
下のexorした結果の100001000110・・・
が送信するデータになるんでしょうか?
つまり送信するデータ量だけシフトしてexorをとる必要
があるのでしょうか?
シフトレジスタ exor結果
00000|0001 → 1
10000|0000 → 0
01000|0000 → 0
00100|0000 → 0
00010|0000 → 0
00001|0000 → 1
10000|1000 → 0
01000|0100 → 0
00100|0010 → 0
00010|0001 → 1
10001|0000 → 1
11000|1000 → 0
0424デフォルトの名無しさん
2010/03/07(日) 01:59:170425デフォルトの名無しさん
2010/03/19(金) 11:30:090426デフォルトの名無しさん
2010/03/19(金) 13:40:34(x%(b-a))+aじゃダメか?
0428デフォルトの名無しさん
2010/03/19(金) 21:00:19なんとなくだけど、左シフトはあんまり
よくない気が。
ANDでLSBを0にするほうがいいと思う。
疑似乱数的に考えて。
0429デフォルトの名無しさん
2010/03/20(土) 04:38:340430|ω・`)
2010/03/20(土) 21:46:15全ビット詰まってて上位ビットほどランダムならシフトしない方がいいし
全ビット詰まってて全ビットがランダムならどっちでもいい
あと>>425はビット演算だけじゃやってらんない
算術必要じゃん、入力になんか仮定を置かないと
0431デフォルトの名無しさん
2010/03/21(日) 13:41:44といっても、そういう期待以上のものは
なかなかないだろうな。
0432デフォルトの名無しさん
2010/03/24(水) 00:57:270433,,・´∀`・,,)っ-○○○
2010/04/06(火) 21:21:32偶数固定: (n & 0xFFFFFFFE)
奇数固定: (n | 1)
0434デフォルトの名無しさん
2010/04/07(水) 14:13:21偶数固定時にaが奇数かつn=aの場合とか、
奇数固定時にbが奇数かつn=b-1の場合…
0435デフォルトの名無しさん
2010/05/20(木) 19:09:550436デフォルトの名無しさん
2010/08/11(水) 16:30:000437デフォルトの名無しさん
2010/09/16(木) 00:47:080438デフォルトの名無しさん
2010/09/16(木) 00:56:48ビットフィールドの定義順って
実際のビット順に反映されますか?
あと先に定義書かれてる方と後の方とでは
どっちが上位ビットになりますか?
例えば64ビットのときのメモリ上のバイト順は?
0439デフォルトの名無しさん
2010/09/16(木) 01:02:210440デフォルトの名無しさん
2010/09/16(木) 01:26:120441デフォルトの名無しさん
2010/09/16(木) 01:35:300442デフォルトの名無しさん
2010/09/16(木) 01:36:020443デフォルトの名無しさん
2010/09/16(木) 01:43:24スレチである!出てけ!
0444デフォルトの名無しさん
2010/09/16(木) 01:43:56処理系依存なら仕方ないだろ
0445デフォルトの名無しさん
2010/09/16(木) 05:14:50(ワードのMSB側から割り付けられる)で、#pragma bitfields=reversed を書くと
LSBファーストになる、と書かれてる。441が使うcでその辺の記述を確認しなきゃ
どっちだか判らないだろ。今は多くがルネ系で、これならMSBファーストがデフォ。
0446デフォルトの名無しさん
2010/09/17(金) 13:56:03Big Endian と Little Endian は英語の言い回しが変が感じがするが、これはガリバー旅行記のリリパット (小人) 国の
話から来ているためである。この国では、卵を小さい方の端から割るように勅令を発した国王の支持派 (Little Endian)
と、しきたり通り大きい方の端から割る反対派 (Big Endian) が争いを起こす。この言い回しは、小さな違いが大きな事
態を引き起こしてしまうことを意味していて良くできていると思う。
0447デフォルトの名無しさん
2010/09/17(金) 14:43:160448デフォルトの名無しさん
2010/09/18(土) 08:18:390449デフォルトの名無しさん
2010/09/27(月) 09:16:42うんち君乙
0450デフォルトの名無しさん
2010/10/03(日) 20:51:540451デフォルトの名無しさん
2010/10/03(日) 21:15:410452デフォルトの名無しさん
2010/10/05(火) 07:55:080453デフォルトの名無しさん
2010/10/09(土) 20:13:490454デフォルトの名無しさん
2010/10/09(土) 20:29:56今時の組み込みだとSH、ARM、ATOM辺りかなぁ?
0455デフォルトの名無しさん
2010/10/10(日) 03:28:020456デフォルトの名無しさん
2010/10/10(日) 06:48:240457デフォルトの名無しさん
2010/10/10(日) 22:48:140458デフォルトの名無しさん
2010/10/11(月) 00:00:49デスクトップにあるやつ
0459デフォルトの名無しさん
2010/10/12(火) 22:10:370460デフォルトの名無しさん
2010/10/15(金) 16:00:400461デフォルトの名無しさん
2010/10/15(金) 18:57:580462デフォルトの名無しさん
2010/10/15(金) 19:00:310463デフォルトの名無しさん
2010/10/19(火) 22:06:100464デフォルトの名無しさん
2010/10/23(土) 05:08:54if( ( (current>read) &&
(current-read)>=3 ) ||
( (read>current) &&
(read-current)>=3 ) ) {
とやってるんですが、なんかもう少しスマートな演算がありそうな気がします。
どうすればいいでしょうか?
0465デフォルトの名無しさん
2010/10/23(土) 06:54:360466デフォルトの名無しさん
2010/10/23(土) 07:03:27そういうこと?
0467デフォルトの名無しさん
2010/10/23(土) 07:19:48current=5, read=3とかの場合>>464の結果と違う事にならん?
0468デフォルトの名無しさん
2010/10/23(土) 07:47:06仮に>>464から 差が3(11b)より大きいの意味だとすると
(current-read)>=3 ではなく (current-read)>3 とすべきなのでは
0469デフォルトの名無しさん
2010/10/23(土) 08:39:24>LSB2bitより大きく
これだと4以上というようになると思うけど…
まあそれはいいとして
この手のは一時変数を使うと見やすくて分かりやすいと思う、個人的に
ushort t_read = read, t_current = current;
if ( t_current < t_read ) t_current = read, t_read = current;
if ( (t_current - t_read) >= 3 ) {...
マジレスするならやはり三項演算子だろう
if ( (current>read ? current-read : read-current) >= 3 ) {...
0470デフォルトの名無しさん
2010/10/23(土) 09:34:560471デフォルトの名無しさん
2010/10/23(土) 09:38:34if( (unsigned)(c-r+2) > 4U ) {...
int=shortの環境は知らないがw
0472464
2010/10/23(土) 14:03:45ようにしたいんです。>=3ではなくて>3のほうが判定が軽いならそれでもいいです。
>>465で判定が軽ければ、5→3の変化を拾ってしまってもいいかも・・・ あ!
捨てるマスクを3bitにすれば7→3で4変化だから、引き算>3と同じ判定になるかも。
どうでしょうか?
0473デフォルトの名無しさん
2010/10/23(土) 15:06:280474464
2010/10/23(土) 16:09:16になるように補正して使います。出力値も10bitなのですが、LSBまで変化を拾って
しまっては、bitシリアルな出力コマンドの数が出過ぎるので、間引きしたい訳です。
0475デフォルトの名無しさん
2010/10/23(土) 16:13:510476デフォルトの名無しさん
2010/10/23(土) 17:05:32結局のところ、前回の値との差が n 以上なら、ということなのだから、
const int diff = current - read;
if ( diff >= n || diff <= -n ) ...
というのが素直な表現だと思う。
で、470 でも十分意図は伝わると思う。464 よりはずっとわかりやすい。
なんなら /*前回の値との差が n 以上なら*/ とコメントしておくとよりよいかもしれない。
そして、abs は CPU によっては命令があるし、コンパイラによっては abs 命令や cmov を使ってくれるかもしれない。
>>475
00 0000 0100 と 00 0000 0011 の間で振動するかもしれないからダメだということでしょ。
0477デフォルトの名無しさん
2010/10/23(土) 17:32:050478デフォルトの名無しさん
2010/10/23(土) 19:40:470479デフォルトの名無しさん
2010/10/23(土) 19:46:310480デフォルトの名無しさん
2010/10/23(土) 21:37:11if (read != cur) {
read = cur;
}
0481デフォルトの名無しさん
2010/10/23(土) 22:57:50cur = ADC & ~3; とかでいいわけだし。
0482デフォルトの名無しさん
2010/10/23(土) 23:26:440483464
2010/10/24(日) 03:04:55(このCのabsは関数コールになるので) やはり変えないでおきます。
相談に乗ってくれてありがとうございました。
0484デフォルトの名無しさん
2010/10/24(日) 03:14:38だから abs() ならコンパイラがイイ具合にしてくれるかもしれないと言ってるんだ。
コンパイラと CPU の組み合わせによっては関数呼び出しではなく、もっといいものにしてくれる。
出荷時に予定している最適化オプションでコンパイルして出力を見てみるといい。
0485464
2010/10/24(日) 05:57:26割り込みmask操作系、eepmov系、左右ローテート系 ぐらいしかありません。
if( abs(curr-read)>=3 ) { は、R6=curr-read で JSR @abs:24 が出ます。
重さは同じなので、今度書くときには表現の簡潔さでこちらを使うとおもいます。
0486デフォルトの名無しさん
2010/10/24(日) 07:42:150487デフォルトの名無しさん
2010/10/24(日) 13:39:300488デフォルトの名無しさん
2010/10/24(日) 14:45:31算術シフトであることを言わないと。
0489デフォルトの名無しさん
2010/10/24(日) 15:58:12INVALID_RANGE = 7; // 差分がこの範囲(-3 〜 +3)は無視する
LOWER_BOUND = -(INVALID_RANGE / 2);
((unsigned)(current - read - LOWER_BOUND) > INVALID_RANGE) ? "ok" : "ignore";
C言語の規格には詳しくないので、これがどの程度ポータブルなのかわからん。
キャストする代わりに、0ではなくINT_MINに片寄せするほうがよいのかも。
0490デフォルトの名無しさん
2010/10/24(日) 19:58:32ものにも因るけど、音とかだったら、
折れ線近似程はやらないとダイナミックレンジかせげんちゃう?
0491デフォルトの名無しさん
2010/10/24(日) 20:16:12生データとって、パソコンでデータ解析とかやったらいいんじゃん
アルゴリズムとかも生データ見ながらのほうがいいと思うけど
考えすぎなだけのような気がするけど
0492デフォルトの名無しさん
2010/10/24(日) 20:29:49音は無条件に下の方がつぶれるよ
人間の耳の感度が対数特性持ってるから…
0493デフォルトの名無しさん
2010/10/24(日) 22:19:360494デフォルトの名無しさん
2010/10/24(日) 22:47:160495デフォルトの名無しさん
2010/10/25(月) 18:50:42n秒おきに処理するには
どう計算するのが速い?
0496デフォルトの名無しさん
2010/10/25(月) 18:55:39前の処理が終了してからn秒後に次の処理を始める
前の処理を開始してからn秒後に次の処理を始める
の2通り考えられるしなぁ
PITみたいにフレーム毎に
A--;
if(A==0){
A=B;
event();
}
するのが良いかと
0498デフォルトの名無しさん
2010/10/25(月) 19:24:300499デフォルトの名無しさん
2010/10/25(月) 19:56:17余計な判定いらないし
0500デフォルトの名無しさん
2010/10/26(火) 06:04:45スレタイをご覧ください。
0501デフォルトの名無しさん
2010/10/26(火) 06:31:130502デフォルトの名無しさん
2010/10/26(火) 22:43:35自動餌やり器か何かをコーディングするためにビット演算スレで質問ってこと?かわいい!
↓
バグ混入によりひよこが32768日分の餌に埋れて死亡
0504デフォルトの名無しさん
2010/10/31(日) 16:10:40俺らには関係ある話?
0505デフォルトの名無しさん
2010/10/31(日) 17:15:14http://www.oreilly.co.jp/books/4873112885/#toc
0506デフォルトの名無しさん
2010/11/02(火) 17:09:31で最下位ビットを取り出せますが、最上位ビットはできませんか?
0507,,・´∀`・,,)っ-○○○
2010/11/02(火) 17:19:000508デフォルトの名無しさん
2010/11/02(火) 17:40:270509デフォルトの名無しさん
2010/11/02(火) 23:19:27(x >> (sizeof (unsigned int) * 8 - 1)) & 1
0510,,・´∀`・,,)っ-○○○
2010/11/02(火) 23:41:58先頭/末尾から数えて最初の1だけを取り出すって意味ね
AMDは次の世代のCPUでTZCNT命令を追加する予定のようだね。
新命令を作るよりは今あるBSR/BSFを速くしろと思うんだが。
0511デフォルトの名無しさん
2010/11/03(水) 21:45:57HTT:マルチスレッド、HTT最適化ベンチマークの数値を上げる。
ただしシングルスレッド性能低下と爆熱化、消費電力向上のおまけ付き。有効活用出来る場面はニッチな用途のエンコードのみ。
ターボブースト:疑似OC。シングルスレッドベンチマークの数値を上積みでき、ベンチマーク結果表に定格のクロックで表記出来る。
コア性能が上がったとぬか喜びできる機能。実際はCore2から進歩していません。
PowerGate:未使用コアに電力を一切流さない事で省電力化を計れる・・・割にあまり下がっていません。
アイドル時に低クロック・低電圧駆動をし未使用コアへの電力供給を切ってようやく数Wの違いですか。
http://pc.nikkeibp.co.jp/article/news/20081103/1009419/?SS=imgview&FD=1213287981
http://pc.nikkeibp.co.jp/article/news/20090909/1018460/?SS=imgview&FD=1952977057
悪い悪くないの問題じゃなく、事実としてCore2Duo,Core2Quad,Core i7はもっさりCPU
キャッシュに収まらない処理をするとAMD製CPUには無いプチフリを頻発する欠陥品
CoreMAはもっさりテクノロジー
0512,,・´∀`・,,)っ-○○○
2010/11/03(水) 22:36:250513デフォルトの名無しさん
2010/11/06(土) 00:57:19それで売れるからな
メディアは広告ばんばんだしてやれば、
勝手にインテル有利のベンチだけの提灯記事書いてくれる
0514デフォルトの名無しさん
2010/11/09(火) 13:20:00ここはもっとIntel悲惨過ぎ
SSD一枚時より速度落ちるってなんだよ
専用のRAIDカードの次に早いAMD
http://akiba-pc.watch.impress.co.jp/hotline/20100904/sp_ssd2.html
LSI MegaRAID SAS 9260-8iが最速、次いでAMD SB850となった。
AMD SB850はチップセット標準の機能である点を考えると、かなりコストパフォーマンスが高い。
RAID 0すると、逆に速度が落ちるIntel
http://akiba-pc.watch.impress.co.jp/hotline/20100904/sp_ssd2.html
Marvell 88SE9128に関しては単体時よりも速度が落ちる結果となってしまった。
いろいろ手は尽くしてみたものの、速度を引き出すことはできなかった。
Marvell 88SE9128のRAID機能はおまけ程度に見ておいた方がいい。
0515デフォルトの名無しさん
2010/11/09(火) 13:22:27SATA 6Gbpsが二つしか付いてないIntelはテストすら出来ないときた
http://akiba-pc.watch.impress.co.jp/hotline/20100904/sp_ssd3.html
4台RAID 0でもLSI MegaRAID SAS 9260-8iが最速。
頭一つ抜けて速度が出ているので、高速性をウリとするハードウェアRAIDカードの真価を発揮したといったところだろう。
2番目に高速となったAMD SB850だが、チップセットの890GX - SB850間の帯域幅の問題でシーケンシャル速度が頭打ちになっている可能性はあるものの、チップセットのRAID機能で実測1GB/sを超えられるのは正直脅威だ。
RAID 0に関しては、並みのRAIDカードではAMD SB850の性能を上回ることは困難だろう。
コストパフォーマンス面でもずば抜けており、素晴らしい製品といえる。
LSI 3ware SAS 9750-8iは2台RAID 0の時と同じく、相性なのか書き込み性能が出ない。
同じコントローラを搭載するMegaRAID SAS 9260-8iが高速な点を考慮すると、ドライバやファームウェアの改良で大きく変わる可能性があるので、今後に期待したい。
3Gbps対応品に関しては2台RAID 0から速度が伸び悩むかたちとなった。
おそらく、コントローラの性能云々ではなく、カード側の帯域幅やチップセット間の帯域幅の上限に達してしまっていると思われる。
今回テストしたIntel ICH10RとLaCie SATA II 3Gbits/s PCI-Express Card 4Eに関しては、使用するならSSDは2台までにした方がいいだろう。
全編を通してみると、AMD SB850のコストパフォーマンスの良さが光る結果となった。
チップセットの標準機能でここまで高性能なのは脅威を感じるほど。
速度に関しては高いポテンシャルを持ったなチップセットなので、AMD SB850ユーザーには積極的に高速なディスクを組み合わせて使ってもらいたい。
0516デフォルトの名無しさん
2010/11/09(火) 17:06:120517デフォルトの名無しさん
2010/11/09(火) 17:33:090518デフォルトの名無しさん
2011/01/23(日) 02:22:290519デフォルトの名無しさん
2011/01/24(月) 17:57:14ちなみにどうやったんですか?
一発でとれるんですか?
0520デフォルトの名無しさん
2011/01/24(月) 21:16:26ビット演算は左に伝播するため
xの型がわからなければ無理、が教科書的な回答じゃなかろか
それらの技術を駆使すれば
Boostに「熟練したプログラマでも云々」ってソースにコメントが書いてあるNextCombinationを
ビット演算とfor文だけで実装出来たりして面白い
0521デフォルトの名無しさん
2011/01/24(月) 21:53:19検索したら見つかったけど、長いから採用しませんでした。
0522デフォルトの名無しさん
2011/01/28(金) 02:24:36もっといいのないですか?
c ^= c >> 1 & (c - 1 & 31) + 38 & 32;
0523デフォルトの名無しさん
2011/01/28(金) 03:13:120524,,・´∀`・,,)っ-○○○
2011/01/28(金) 04:08:02その程度ならテーブル引いたほうが速いんじゃね?
というか大文字と小文字を逆転する意味が不明。
たとえば大文字を小文字に変換(あるいはその逆)ならそれなりにあるけど
(大文字小文字区別なしの文字列検索・置換処理とかね)
んでもってこの手の処理はSSE*とかで纏めてやったほうが速い。
実際glibcのSSE対応パッチなんかも出てる
0525デフォルトの名無しさん
2011/01/28(金) 04:31:45意味が不明とか言ってやるなよ
0526,,・´∀`・,,)っ-○○○
2011/01/28(金) 05:45:56c = isupper(c)? tolower(c) : toupper(c);
そもそも動作確認してないだろ。
ちょっとRubyでチェックしてみたぜ。
def exchange_char_pedantic(c)
c ^= c >> 1 & (c - 1 & 31) + 38 & 32;
end
def exchange_char(c)
clower = c.chr.downcase[0]
c = (c == clower)? c.chr.upcase[0] : clower
end
256.times {|i|
printf("0x%02x ", i) if exchange_char_pedantic(i) != exchange_char(i)
}
このスクリプトでエラーになるパターンがこんだけ出ますた。使い物になりませんな。
0xc1 0xc2 0xc3 0xc4 0xc5 0xc6 0xc7 0xc8 0xc9 0xca 0xcb 0xcc 0xcd 0xce 0xcf 0xd0
0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7 0xd8 0xd9 0xda 0xe1 0xe2 0xe3 0xe4 0xe5 0xe6
0xe7 0xe8 0xe9 0xea 0xeb 0xec 0xed 0xee 0xef 0xf0 0xf1 0xf2 0xf3 0xf4 0xf5 0xf6
0xf7 0xf8 0xf9 0xfa
せっかく頑張ったけど残念でしたね。
ただ、7ビットASCII空間に限定すればこの式でもいいんじゃね?
分岐除去っていう「下らないこだわり」を捨てられるならね。
そもそも最近のCPUでは分岐って遅くないですし。
0527デフォルトの名無しさん
2011/01/28(金) 06:00:55>>522はS-JIS判定コードのノリだと思うんだが
0528,,・´∀`・,,)っ-○○○
2011/01/28(金) 06:14:380529522
2011/01/28(金) 12:47:54大文字変換なら c |= 小文字変換なら c &= ~() にすればOK
8bitなら、~(c >> 2) & を加えればOK
実際に半々とかで分岐する場合、分岐は今でも遅いんじゃないか?
分岐とかをビット演算に直す理論とか考えたら面白いかな、と思って書いてみました
0530デフォルトの名無しさん
2011/01/28(金) 16:02:060531デフォルトの名無しさん
2011/01/28(金) 16:55:140532デフォルトの名無しさん
2011/01/28(金) 16:57:340533,,・´∀`・,,)っ-○○○
2011/01/28(金) 21:01:44#define islower(c) ( ((c) >= 'a') && ((c) <= 'z'))
char exchange(char c)
{
return (isupper(c) || islower(c)) ? (c^32) : c;
}
これをGCCで最適化したらこうなった
_exchange:
movzx eax, BYTE PTR [esp+4]
lea edx, [eax-97]
cmp dl, 25
ja L7
L4:
xor eax, 32
ret
.p2align 4,,10
L7:
lea edx, [eax-65]
cmp dl, 25
jbe L4
.p2align 4,,3
rep
ret
んでさ手元のPCでテキスト置換速度を比較してみな?
http://sourceforge.jp/projects/sfnet_isalepoint/downloads/iSalePoint/GPLV3.txt/
これで試しにやってみたけど分岐したほうが速かった。
一番速いのはSIMD並列化版。
あとARMなんかだとこれ、全く分岐の無いコードにしてくれるよ
0534デフォルトの名無しさん
2011/01/28(金) 21:21:200535デフォルトの名無しさん
2011/01/28(金) 23:02:03俺の環境(Phenomでvisual c++ 2010)だと10000回で
分岐: 1845ms
522の方法: 1113ms
522をSSEで: 73ms
だったぞ
0536デフォルトの名無しさん
2011/01/28(金) 23:05:020537デフォルトの名無しさん
2011/01/29(土) 00:11:250538デフォルトの名無しさん
2011/01/29(土) 00:12:200539,,・´∀`・,,)っ-○○○
2011/01/29(土) 00:22:58c ^= pcmpestrm(c, [A-Za-z]) & 0x20
0540デフォルトの名無しさん
2011/01/29(土) 00:40:250541,,・´∀`・,,)っ-○○○
2011/01/29(土) 00:51:47diff_lower: dd 0x1F1F1F1F, 0x1F1F1F1F, 0x1F1F1F1F, 0x1F1F1F1F
cmp_lower: dd 0x99999999, 0x99999999, 0x99999999, 0x99999999
exch_mask: dd 0x20202020, 0x20202020, 0x20202020, 0x20202020
movdqa xmm0, [src]
movdqa xmm1, xmm0
paddb xmm1, [diff_lower]
pcmpeqb xmm1, [cmp_lower]
pand xmm1, [exch_mask]
pxor xmm0, xmm1
pcmpgtbはsignedの比較だから、a〜zを -128〜-103に持っていくのが味噌
c >= 'a' && c <= 'z' をそのまま比較2回(マスク生成)+論理積に置き換えるのは頭の悪いやり方
0542,,・´∀`・,,)っ-○○○
2011/01/29(土) 00:55:15movdqa xmm0, [src]
movdqa xmm1, xmm0
paddb xmm1, [diff_lower]
pcmpgtb xmm1, [cmp_lower]
pandn xmm1, [exch_mask]
pxor xmm0, xmm1
0543,,・´∀`・,,)っ-○○○
2011/01/29(土) 01:03:02cmovとかsbbとか使えばSSE使わなくても分岐の無いコードは書けるよ。
0544,,・´∀`・,,)っ-○○○
2011/01/29(土) 01:04:29c = (101 < (signed char)(c+1)) ? c ^20 : c;
0545デフォルトの名無しさん
2011/01/29(土) 01:16:180546デフォルトの名無しさん
2011/01/29(土) 01:50:53そりゃそうだよ、522も本質的にはcmovと同じ
(c - 1) & 31 + 38
をすると5bit目がフラグの代わりになる
'a'と'A'の下五桁が00001なので
理論的に面白いかなと。
テーブルを与えると、自動的にそのテーブルと同じ出力のビット演算を出力するツールとか
ビット演算とシフトの数学みたいなの考えればいいのだけど
0547,,・´∀`・,,)っ-○○○
2011/01/29(土) 02:46:100548デフォルトの名無しさん
2011/01/29(土) 08:21:200549,,・´∀`・,,)っ-○○○
2011/01/29(土) 17:14:59vpand xmm1, xmm0, [mask_0x0f0f0f0f]
vmovdqa xmm2, [bsf_nibble_low]
vpshufb xmm2, xmm2, xmm1
vpsrld xmm1, xmm0, 4
vpand xmm1, xmm1, [mask_0x0f0f0f0f]
vmovdqa xmm3, [bsf_nibble_high]
vpshufb xmm3, xmm3, xmm1
vpminub xmm2 xmm2, xmm3
0550デフォルトの名無しさん
2011/01/30(日) 01:01:39xmmレジスタを128bit整数型と見て、それ全部に対してBSF命令を使いたいんです
destが0〜127になるような
0552,,・´∀`・,,)っ-○○○
2011/01/30(日) 14:17:01ptest xmm0, xmm0
jnz .bsf128_error
movq rdx, xmm0
bsf rax, rdx
jnz .bsf128_done
pextrq rdx, xmm0, 1
bsf rax, rdx
add eax, 64
.bsf128_done:
0553デフォルトの名無しさん
2011/01/31(月) 04:17:330554,,・´∀`・,,)っ-○○○
2011/01/31(月) 06:42:06jz .bsf128_error
あああ
x86ならソコソコいけると思ったのだけど。
0556,,・´∀`・,,)っ-○○○
2011/02/01(火) 03:02:56mov ecx, -64
movq rax, xmm0
test rax, rax
pextrq rdx, xmm0, 1
cmovnz ecx, rax
cmovnz rax, rdx
bsf rax, rax
lea rax, [rax + rcx + 64]
0557,,・´∀`・,,)っ-○○○
2011/02/01(火) 03:07:040558デフォルトの名無しさん
2011/02/02(水) 00:35:07じゃあ、とりあえず x を入力すると x+1 番目の素数 y を出力する
ビット演算大喜利とかやって見る?
x のビット数縛りで。
y = 2|x; // 1 bit ルール
y = (0x7532 >> (x<<2)) & 7; // 2 bit ルール
y = (0x13110d0b07050302 >> (x<<3)) & 255; // 3 bit ルール
あはは…ヘタレで済まんね、、
0559デフォルトの名無しさん
2011/02/02(水) 03:48:040560デフォルトの名無しさん
2011/02/02(水) 06:33:200561デフォルトの名無しさん
2011/02/02(水) 12:53:17こういうのって自力で見つけたりするの?
専門の本があったりするの?
0562デフォルトの名無しさん
2011/02/02(水) 22:18:310563,,・´∀`・,,)っ-○○○
2011/02/03(木) 03:14:25x86依存の最適化はコンパイラの出力が教科書
てか、こっちのほうがコードサイズ小さくなくるか
mov ecx, 64
movq rax, xmm0
test rax, rax
pextrq rdx, xmm0, 1
cmovz ecx, rax
cmovnz rax, rdx
bsf rax, rax
add eax, ecx
<余談>
Penrynのptestってpcmpeqb → pmovmskb → testと大して性能変わらないかも知れん
0564,,・´∀`・,,)っ-○○○
2011/02/03(木) 04:58:31mov ecx, 64
movq rax, xmm0
test rax, rax
pextrq rdx, xmm0, 1
cmovnz ecx, rax
cmovz rax, rdx
bsf rax, rax
add eax, ecx
0565デフォルトの名無しさん
2011/02/28(月) 03:19:36.80同じ質問だが、こちらで聞くのでご容赦してくれ。
ビット・オンの最上位のみ残したい場合、
ビットスキャンリバースを使わずに、いい方法ないかな。
ビット・オンの最下位のみ残す場合は、例えば対象の値を80としたとき、
mov eax,80
mov ebx,eax
neg eax
and eax,ebx
こんな感じよね。
これをビット・オンの最上位でやりたいんだが、何かいい方法ないかな。
最下位フラグを消していく方法を繰り返すくらいなら、素直にビットスキャンしちまうんだが。
なければ、ない、と言ってくれ。
0566デフォルトの名無しさん
2011/02/28(月) 03:27:28.130567デフォルトの名無しさん
2011/02/28(月) 04:25:50.25ビットスキャンリバースって何?
まぁ、効率は悪いけど、ぱっと思いつくのは、
シフト(1→2→4…と必要なだけ)と論理和を繰り返して1を加算後シフト。
最後に、必要であれば、元の数の最上位ビットだけ取り出すとかかな…
何か他にもありそうな気がするので思いついたら、また書く
0568デフォルトの名無しさん
2011/02/28(月) 05:38:32.66駄目だ、思いつかんかった
取り合えず>>567をコードにするとこんな感じ
アセンブラは数年ぶりなんで、ミスってたらスマソ
mov eax, 80
mov ebx, eax
shr eax, 1
or ebx, eax
mov eax, ebx
shr ebx, 2
or eax, ebx
mov ebx, eax
shr eax, 4
or ebx, eax
mov eax, ebx
shr ebx, 8
or eax, ebx
mov ebx, eax
shr eax, 16
or ebx, eax
and eax, 80000000h
add ebx, 1
shr ebx, 1
or eax, ebx
0569デフォルトの名無しさん
2011/02/28(月) 06:05:49.46アンガトさん。
bsr (Bit Scan Reverse)。bsf の逆順ですy
おいらにとっては難題なの。
考え始めて早数年。
実現方法はいくらでもあるので、可不可の問題ではない。
でも最下位セットビットに関しては一発二発でいけるわけだから、
どうせならスマートな方法見つけたい。
可能性としては、最大値の商を何とかさへば、どうにかなんべ。
ところがうまくいかんでは。
0570,,・´∀`・,,)<一番良い -○○○ を頼む
2011/02/28(月) 06:11:39.07pcmpeqd xmm1, xmm1
pslld xmm1, 23
movd xmm0, eax
cvtsi2ss xmm0, xmm0
andps xmm0, xmm1
cvtss2si xmm0, xmm0
movd eax, xmm0
Atomでも使わない限りBSR使ったほうが速い気もするけどな。1〜2サイクルだし。
0571デフォルトの名無しさん
2011/02/28(月) 06:35:51.04一発で行きたいだけなら、fpuのlog使えば?(多分fyl2x当たり)
まぁ、効率が良いかは分からんが…む
0572デフォルトの名無しさん
2011/02/28(月) 07:03:26.85さんくす。最上位のみ残すという目的は果たせるね。
正直、浮動小数点数変換考えてなかった。
望んだビット操作とは少しちがう感じだけど、
本懐を遂げることは出来る感じ。
しかも符号付整数には変な感じに対応できる。
笑えるし、要所で使えるかも。
でも、整数除算で何ともならないのは如何ともしがたいところ。
0573565
2011/02/28(月) 07:11:54.98>>548
参考までに、用件から大きくずれるが、最下位のみ残すなら、
xmm0に128ビット整数が読まれているとして、
pcmpeqd xmm7,xmm7 //マイナス1作成
paddd xmm7,xmm0 //paddqだろーが何だろーがok
pandn xmm7,xmm0 //128ビット中、最下位セットビットのみ残る
問題は、どうしてもビットスキャンしたい場合(つまりこれが本題)だが、
ビットシフト(まずは右詰め)したい場合
当然128ビットのままビット単位でシフトできないので、
そもそもインデックス(合計シフト回数)を求める必要性が疑問。
SIMD使わずに、bsf の後、非ゼロdest以降は shrd の繰り返しが良いのでは?
もしくは、他のビット列を左シフトして最下位をそろえたい場合、
同様にshldの繰り返しになると予想。
条件次第では、上記の例のxmm7を利用し
pmuludq dest,xmm7 //桁あふれ対策は別途。shldよりもこちらの方が楽かも。
でいけばハッピー。
右シフト(除算)と違い、64ビット符号なし整数乗算できるのがミソ。
こんな感じで、作業内容によってはインデックス(シフト回数)を求める必要はないと思う。
本末転倒でスマン。
0574565
2011/02/28(月) 17:50:02.89頭わりーな。
paddq xmm7,xmm0
の場合でも、上位64ビットと下位64ビットを別に処理しなきゃならん。
32ビットごとの処理でも、下位の結果を上位に反映させるためのマスク処理必須だし。
結局使えんな。
恩返しにならなくてすまん
0575デフォルトの名無しさん
2011/02/28(月) 21:45:27.21i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >>> 1);
}
0576デフォルトの名無しさん
2011/03/01(火) 00:00:08.140577565
2011/03/01(火) 07:38:10.13こうしてみると、見やすいですね。
考えてもみれば、非64環境で64ビットに対応できる貴重な方法だし。
引き出しに入れときます。ありがとう。
変形できそうで、出来ないのが残念。
>>576
今の時代なら16ビットでも問題なさそう。
でも対象ビットが増えたときに、分岐処理が悩ましいのね。
0578デフォルトの名無しさん
2011/03/01(火) 20:42:43.070579,,・´∀`・,,)<一番良い -○○○ を頼む
2011/03/01(火) 23:48:35.21MSBが立ってるときだけ下位31ビットをクリアでいいんじゃね?
FPUを使うというアイディアはHDを紹介してたブログ主が言及してた。
x87とMMXはレジスタ共有してるからダイレクトにビットフィールドにアクセスできるとか云々
0580デフォルトの名無しさん
2011/03/02(水) 01:20:52.15>>565が本当に欲しい機能が何なのかは分からんが
負の値を考慮した場合、欲しいのは、絶対値に換算後の結果なのか、
単にMSBを無視した値なのかとか、場合によって欲しい結果は違うからね…
0581,,・´∀`・,,)<一番良い -○○○ を頼む
2011/03/02(水) 17:40:30.11つーか、cvtsi2ssはソースレジスタはGPRだった。なのでmovd不要。
0582デフォルトの名無しさん
2011/03/27(日) 00:01:01.84なんのために付いてんだ?
0583デフォルトの名無しさん
2011/03/27(日) 01:34:50.110584デフォルトの名無しさん
2011/03/27(日) 10:07:13.440585デフォルトの名無しさん
2011/04/29(金) 21:37:00.25数年ブランクがあるから忘れちゃった
0586デフォルトの名無しさん
2011/04/29(金) 21:43:16.84単に8の倍数に切り捨てたいだけなら、n & ~(8-1)
0587デフォルトの名無しさん
2011/04/29(金) 22:22:50.68ありがとうございます。
0588デフォルトの名無しさん
2011/04/30(土) 01:14:08.600589デフォルトの名無しさん
2011/05/05(木) 20:30:16.230590デフォルトの名無しさん
2011/05/05(木) 20:34:15.690591デフォルトの名無しさん
2011/05/06(金) 11:00:57.160592デフォルトの名無しさん
2011/05/06(金) 19:04:13.47を
7060504030201000
みたいに隙間1ビット開けるのってどうする?
0593,,・´∀`・,,)っ-○○○
2011/05/06(金) 19:06:39.150594デフォルトの名無しさん
2011/05/06(金) 19:16:58.40っていうか間を空けたいっていう例だろ
0595,,・´∀`・,,)っ-○○○
2011/05/06(金) 19:24:34.8916ビットならこれが速いかも(pshufbが使えない場合はunpack命令数回で代替)
pshufb→pand→pcmpeqb→pmovmskb
0596,,・´∀`・,,)っ-○○○
2011/05/06(金) 19:37:15.130597,,・´∀`・,,)っ-○○○
2011/05/06(金) 19:47:57.16n = (n | (n << 8)) & 0x00FF00FF;
n = (n | (n << 4)) & 0x0F0F0F0F;
n = (n | (n << 2)) & 0x33333333;
n = (n | (n << 1)) & 0x55555555;
0598デフォルトの名無しさん
2011/05/06(金) 20:13:08.020599592
2011/05/06(金) 21:53:29.470000b->00000000b
0001b->00000010b
0010b->00001000b
0100b->00100000b
1001b->10000010b
みたいな
特に用途は思いつかなかったんだけどw
0600デフォルトの名無しさん
2011/05/06(金) 22:30:53.41テーブルを持つのが定跡でしょうか?
0601デフォルトの名無しさん
2011/05/07(土) 09:44:12.66たとえば 0x36 を 0x00 0x00 0xff 0xff 0x00 0xff 0xff 0x00 のように展開したいとかそういうこと?
0602デフォルトの名無しさん
2011/05/07(土) 10:16:30.980603,,・´∀`・,,)っ-○○○
2011/05/07(土) 10:40:19.001ニブルなら2行目まででおk
0604600
2011/05/07(土) 10:40:25.520605,,・´∀`・,,)っ-○○○
2011/05/07(土) 10:44:19.63ないのかよ!
Graphics Gems Iを読んでみたらビットインターリーブの応用例が出ている。
実用性の無い技術を磨くことほど無駄なことは無いからな。
解ってると思うけど、世の中で役に立つのは自己満足のコード書くことより
必要十分な、他の人が読めるコード書くスキルだからな
0606デフォルトの名無しさん
2011/05/07(土) 12:15:23.9764ビット1ワードで、8*256=2Kバイトか。64ビットマシンでメモリに余裕があるならテーブルでいいんじゃない?
0607デフォルトの名無しさん
2011/05/07(土) 12:27:25.370608,,・´∀`・,,)っ-○○○
2011/05/07(土) 13:32:18.051. 16ビットを8ビットずつにわけでpshufbでコピー(なければunpack命令で代用)
AA BB
↓
AA AA AA AA AA AA AA AA BB BB BB BB BB BB BB BB
2. pandでビットマスクとってpcmpeqb
ビットパターンは
0x80 0x40 0x20 0x10 0x8 0x4 0x2 0x1 0x80 0x40 0x20 0x10 0x8 0x4 0x2 0x1
見たいな感じね
0609,,・´∀`・,,)っ-○○○
2011/05/07(土) 13:33:27.170610デフォルトの名無しさん
2011/05/07(土) 13:50:06.860611デフォルトの名無しさん
2011/05/08(日) 13:18:22.390612デフォルトの名無しさん
2011/05/09(月) 00:46:51.850613デフォルトの名無しさん
2011/05/09(月) 02:09:53.540614デフォルトの名無しさん
2011/05/09(月) 02:21:59.260615デフォルトの名無しさん
2011/05/09(月) 03:36:38.65自作PCあたりで元気に発狂してた
0617デフォルトの名無しさん
2011/05/09(月) 07:32:34.390618デフォルトの名無しさん
2011/05/09(月) 07:52:37.53よかったよかった
0619デフォルトの名無しさん
2011/05/13(金) 23:31:28.61ビットの位を反転させる以下のような演算を行うことは可能でしょうか?
概要:
符号なし整数 n, 最上位ビット a から 符号なし整数 n' を求める
例:
a = 4 のときの n → n'
0000 0000 → 0000 0000
0000 0001 → 0000 1000
0000 0110 → 0000 0110
0000 1111 → 0000 1111
a = 6 のときの n → n'
0000 0000 → 0000 0000
0000 0001 → 0010 0000
0000 0110 → 0001 1000
0000 1111 → 0011 1100
0620デフォルトの名無しさん
2011/05/13(金) 23:33:19.41× 最上位ビット a
○ 最上位の桁数 a
0621デフォルトの名無しさん
2011/05/14(土) 04:01:08.840622デフォルトの名無しさん
2011/05/14(土) 11:11:33.67int revx(int n,int a){
return n*table1[a]%table2[a];
}
で行けるけど
ビット演算だけだときつくないか?
0623622
2011/05/14(土) 11:38:00.25正しくは
return(n*table1[a]&table2[a])%table3[a];
0624デフォルトの名無しさん
2011/05/14(土) 17:05:31.10固定幅の反転は知ってる前提でいいのか?
各固定幅反転コードを各々最適化しておいて switch(a) するのが結局速い
0625デフォルトの名無しさん
2011/05/15(日) 00:37:55.290626619
2011/05/15(日) 11:17:36.40任意の幅 a に対して処理する必要があるため,今は1ビットごとにループで処理しているのですが
やはりビット演算だけで任意幅は無理があるみたいですね
>>624 の方法で特定の a については分岐する方向で考えてみようと思います
0627デフォルトの名無しさん
2011/06/12(日) 17:44:08.41○+△or□というものがあった場合さ
○+△の2つと□の1つを=として捉えてどちらか(or)という風に捉えるのか
○の1つに加えて(+)△の1つか(or)□の1つという風に捉えるのかどっちなのかな?
記号の優先度とか初歩的な話になるんだろうことが想像出来て恥ずかしいんだけど誰か回答を願いたい
ちなみに数式の時の優先度と物に置き換えた時に記号を充てた時の優先度でも変わるのかどうかとかも
0628デフォルトの名無しさん
2011/06/12(日) 17:59:24.400629デフォルトの名無しさん
2011/06/13(月) 02:37:06.77論理演算子より優先度は高い。 ○+△or□は、
(○+△)or□ と解釈される。 ○+(△or□)とするためには明示的にカッコが必要。
0630デフォルトの名無しさん
2011/06/27(月) 00:47:29.46右詰めで返すのを効率良くできたりしますか?
たとえば a = 10110[2], b = 11011[2] のとき 01010[2] を返して欲しいです.
0631デフォルトの名無しさん
2011/06/27(月) 00:53:31.470632デフォルトの名無しさん
2011/06/27(月) 00:54:14.510633デフォルトの名無しさん
2011/06/27(月) 01:33:52.130634デフォルトの名無しさん
2011/06/27(月) 01:36:58.60「拾ってきて」が分からん。
「右詰めで」も意味分からん。
0635デフォルトの名無しさん
2011/06/27(月) 01:57:34.53bで1が立っているビットしか見ないという意味です.
bで0が立っているビットはなかったことにしたいわけです.
0636デフォルトの名無しさん
2011/06/27(月) 01:57:43.340637デフォルトの名無しさん
2011/06/27(月) 02:04:26.210638デフォルトの名無しさん
2011/06/27(月) 02:16:27.79ビット数が8ぐらいなら、
テーブル参照がお手軽そうだけど、CPUによっては早くなるってわけじゃないからな
0639デフォルトの名無しさん
2011/06/27(月) 04:53:48.19別々に処理して結合しかないな。
「右詰め」は人間にしか判らないし。
b1 = 0b11000;
b2 = 0b00011;
t1 = ((a & b1) >> 1) | ((a & b2));
でt1 = 0b01010が得られる。
0640デフォルトの名無しさん
2011/06/27(月) 06:29:52.82これが叩き台かな。
#define BITSIZE 8
int bitstuff(int a, int b) {
int i, mask = 0, maskbit = 1, bit = 1;
for (i = 0; i < BITSIZE; i++, bit <<= 1) {
if (b & bit) {
mask |= maskbit;
maskbit <<= 1;
} else {
a = ((a & ~mask) >> 1) | (a & mask);
}
}
return a;
}
「ハッカーのたのしみ」にずばり載ってたりするの?
0641630
2011/06/27(月) 10:05:14.77みなさんありがとうございます
0642デフォルトの名無しさん
2011/06/27(月) 11:13:46.61立っているbitの数を数えてから、シフトして結果を作ったほうが効率良い。
さらに、ビットカウントをifなしで出来る事を知っていれば、全体でもifもループも要らないよね。
0643デフォルトの名無しさん
2011/06/27(月) 15:24:04.660644天使 ◆uL5esZLBSE
2011/07/01(金) 16:56:46.170645デフォルトの名無しさん
2011/07/03(日) 01:53:29.14黒の盤面と2個用意して、コマの貼りつけ可能位置を
最速で判定する方法ないかな?
0646デフォルトの名無しさん
2011/07/03(日) 01:55:43.580647デフォルトの名無しさん
2011/07/03(日) 01:56:27.74○他力
0648デフォルトの名無しさん
2011/07/03(日) 02:09:42.91とりあえず、さくっと候補を調べようと思うと
守//守備側
攻//攻め側
候補 = 守<<1 | 守>>1 | 守 << 8 | 守 >> 8 ;
候補 = ( ( 守 | 攻 ) & 候補 ) ^ 候補;
で絞り込めそうな気がする。ある局面でボロが出そうな気もするけど。
あと、八方のひとつに攻め側が存在しないことが解からん。
0649デフォルトの名無しさん
2011/07/03(日) 02:10:09.78テーブル
0650デフォルトの名無しさん
2011/07/03(日) 03:05:42.28で終わりやん
0651デフォルトの名無しさん
2011/07/03(日) 03:06:46.920652デフォルトの名無しさん
2011/07/03(日) 03:13:04.79今日やるから
0653デフォルトの名無しさん
2011/07/03(日) 03:38:16.11ほれ
http://www9.atwiki.jp/othello?cmd=upload&act=open&pageid=28&file=othello_counter4.cpp
俺の知る中での最速
何か質問あればどうぞ
0656デフォルトの名無しさん
2011/07/03(日) 15:41:38.01ありがとう。じっくり読ませてもらうよ。
0657,,・´∀`・,,)っ-○○○
2011/07/03(日) 15:55:21.400658デフォルトの名無しさん
2011/07/03(日) 16:10:52.050659デフォルトの名無しさん
2011/07/03(日) 16:13:19.300660デフォルトの名無しさん
2011/07/03(日) 16:15:53.64http://radagast.se/othello/bitmob.c
0661デフォルトの名無しさん
2011/07/03(日) 16:24:40.340662,,・´∀`・,,)っ-○○○
2011/07/03(日) 16:27:34.770663デフォルトの名無しさん
2011/07/03(日) 16:33:51.080664デフォルトの名無しさん
2011/07/03(日) 16:36:58.350665,,・´∀`・,,)っ-○○○
2011/07/03(日) 18:32:22.352並列化するメリットってあるのかなと思ってさ
0666デフォルトの名無しさん
2011/07/03(日) 23:00:17.61同じ局面で相手が打てると仮定した場合の数は
それぞれAIの評価関数で使い道があるよ
0667デフォルトの名無しさん
2011/07/04(月) 19:03:33.35C言語で2つの16bit変数同士を加算して、
0xffff以上になる時は0xffffとしたいのですが、
どうやればいいでしょうか?
アセンブラだとキャリーフラグを見ればいいのは判るのですが。
0668デフォルトの名無しさん
2011/07/04(月) 19:28:24.75uint16_t a, b, sum;
sum = (~a < b) ? 0xffff : a + b;
0669デフォルトの名無しさん
2011/07/04(月) 23:26:50.41((uint16_t)~a < b)ってやらないと危険だと思う
0670デフォルトの名無しさん
2011/07/05(火) 00:13:15.31こういうのもあるけど、さすがに>>668の方が速いか。
0671デフォルトの名無しさん
2011/07/05(火) 01:12:15.79sum = a+b | (0x80000000-((a+uint32_t(b))>>16) ^ 0x80000000) & 0xffff;
0672天使 ◆uL5esZLBSE
2011/07/05(火) 10:54:50.15ハアアァァァァァァァァアァァァァアァァァァアァアァアアアァアァァアァアァアァァァァ????????????????
0673デフォルトの名無しさん
2011/07/06(水) 00:25:26.68それからは最高の毎日を送っています。
0674デフォルトの名無しさん
2011/07/06(水) 00:57:43.8932ビット演算して値でif。
0675デフォルトの名無しさん
2011/07/06(水) 01:37:41.38ありがとうございました。
0676デフォルトの名無しさん
2011/07/06(水) 02:24:40.56ビット演算使いたいだけちゃうんかと
0677デフォルトの名無しさん
2011/07/06(水) 03:13:14.460678デフォルトの名無しさん
2011/07/06(水) 03:55:01.880679デフォルトの名無しさん
2011/07/06(水) 07:47:15.13http://codepad.org/n3qBdFSG
sadd1: 0.060 sec(ごく普通の分岐)
sadd2: 0.080 sec (ビット演算+分岐)
sadd3: 0.060 sec (ビット演算分岐なし)
http://ideone.com/SFASM
sadd1: 0.060 sec
sadd2: 0.100 sec
sadd3: 0.090 sec
>>671がダントツいくかと期待してたんだけど、
意外に分岐(条件演算子)が速いね。
ま、こいつらは最適化offでビルドしてそうだけど。
gccなら -O3 -march=pentium3 とかでcmov使ったコード出る。
* VisualStudio
sadd1: 0.203 sec
sadd2: 0.218 sec
sadd3: 0.282 sec
* bcc32(5.5) -O2 -OS -6
sadd1: 0.296 sec
sadd2: 0.422 sec
sadd3: 0.344 sec
* gcc(3.4.4) -Wall -ansi -O3 -march=pentium3
sadd1: 0.219 sec
sadd2: 0.234 sec
sadd3: 0.235 sec
0680,,・´∀`・,,)っ-○○○
2011/07/06(水) 08:37:26.860681デフォルトの名無しさん
2011/07/06(水) 08:53:29.03予測がほぼ全て当たる状態になるね
まあ実際の運用でも、入力パターンが予測可能かどうかによって分岐のコストは変わる
全然違う例だけどこのへん参考になるね
http://homepage1.nifty.com/herumi/diary/1011.html#24
0682デフォルトの名無しさん
2011/07/06(水) 09:13:30.050683デフォルトの名無しさん
2011/07/06(水) 09:41:21.74>>681の指摘に伴い引数を変えたバージョンを追加してみました。
http://codepad.org/iAanFePF
name: mark1 mark2 total
sadd1: 60 ms 70 ms 130 ms
sadd2: 70 ms 80 ms 150 ms
sadd3: 70 ms 70 ms 140 ms
http://ideone.com/2Umn5
name: mark1 mark2 total
sadd1: 70 ms 80 ms 150 ms
sadd2: 100 ms 110 ms 210 ms
sadd3: 80 ms 90 ms 170 ms
$ VisualStudio
name: mark1 mark2 total
sadd1: 250 ms 218 ms 468 ms
sadd2: 250 ms 234 ms 484 ms
sadd3: 266 ms 266 ms 532 ms
$ gcc -Wall -ansi -O3 -march=pentium3
name: mark1 mark2 total
sadd1: 203 ms 266 ms 469 ms
sadd2: 234 ms 282 ms 516 ms
sadd3: 234 ms 266 ms 500 ms
なぜかVisualStudioではbench_mark2の方が速い謎。
0684デフォルトの名無しさん
2011/07/06(水) 11:04:10.05return (unsigned short)((a+b) | -((a+b) >> 16U));
0685デフォルトの名無しさん
2011/07/06(水) 12:08:49.40いや、それでもほとんど予測されちゃうな
大部分はパターン0101...を繰り返すだけだから、パターン認識の餌食に
乱数使うのが手っ取り早いね
http://codepad.org/KuAExPhP
0686デフォルトの名無しさん
2011/07/06(水) 12:31:09.03なるほどプロセッサによってぜんぜん挙動が違うんですね。
一度乱数も使ってみたのですが、当方のマシンでは0101の場合とほとんど変わらずでした。
codepadの使ってるマシンだとビット演算の方が2倍近く速いですね。
ふーむ、私のラップトップではビット演算の面白みがないようですw
name: mark1 mark2a total
sadd1: 219 ms 234 ms 453 ms
sadd2: 250 ms 282 ms 532 ms
sadd3: 234 ms 281 ms 515 ms
0687671
2011/07/07(木) 20:36:46.93新たに閃いたコードも入ってます
ttp://ideone.com/7wgVs
3項演算子遅すぎ
0688,,・´∀`・,,)っ-○○○
2011/07/09(土) 10:20:28.81飽和演算程度でパフォーマンスのネックになるほど大量に捌かないと
いけないならSSE使えよって話になるし。
0689,,・´∀`・,,)っ-○○○
2011/07/09(土) 10:34:07.10movd xmm0, ecx ;; a
movd xmm1, edx ;; b
psadw xmm0, xmm1
movd eax, xmm0
ret
0690,,・´∀`・,,)っ-○○○
2011/07/09(土) 11:46:57.72movd xmm1, edx ;; b
psadw xmm0, xmm1
movd eax, xmm0
and eax, FFFFh ;; ←上位ワードのゴミ掃除
ret
ゴミ掃除しとくか
0691デフォルトの名無しさん
2011/07/09(土) 13:57:46.460692デフォルトの名無しさん
2011/07/09(土) 15:02:28.02符号化か何かで。
例えば8bitなら300まで可能、みたいな感じで。
0693デフォルトの名無しさん
2011/07/09(土) 15:07:33.180694デフォルトの名無しさん
2011/07/09(土) 15:12:11.32そういうのでいいです。
0695デフォルトの名無しさん
2011/07/09(土) 15:13:12.570696デフォルトの名無しさん
2011/07/09(土) 15:17:12.10そういうのでいいです。
0697デフォルトの名無しさん
2011/07/09(土) 15:17:36.480698デフォルトの名無しさん
2011/07/09(土) 15:18:13.22いくら符号化しても8ビットで表せるビットパターンが増えるわけではないので、そういうのは不可能だと思うよ。
0699デフォルトの名無しさん
2011/07/09(土) 15:20:28.68あったまい〜
0700デフォルトの名無しさん
2011/07/09(土) 15:22:26.920701デフォルトの名無しさん
2011/07/09(土) 15:27:22.34その区別のために2バイトも使うなんて許せないです。
0702デフォルトの名無しさん
2011/07/09(土) 15:28:24.210703デフォルトの名無しさん
2011/07/09(土) 15:28:40.210704デフォルトの名無しさん
2011/07/09(土) 15:30:31.31けちって1ビットだけ使えばいいじゃん。
スペースをけちるとその分ほかにしわよせがいくけど。
PostgreSQLのNULLの処理はカラムの値とは別にカラムごとのNULLフラグを1ビットずつ持って処理しているよ。
0705デフォルトの名無しさん
2011/07/09(土) 15:32:02.47if (他の変数) {
// 0-255のエリア
} else {
// 256-511のエリア
}
見ての通り「他の変数」が必要だが
0706デフォルトの名無しさん
2011/07/09(土) 15:33:53.38よろしくおねがいしまう。
0707デフォルトの名無しさん
2011/07/09(土) 15:35:33.62パソコンのアプリなら富豪プログラム出来るだろうに
0708デフォルトの名無しさん
2011/07/09(土) 15:37:06.60254→255と遷移したら255、
254以外→255と遷移したら256
とか。
0709デフォルトの名無しさん
2011/07/09(土) 15:46:20.210710デフォルトの名無しさん
2011/07/09(土) 15:50:55.24簡単に考えりゃいいのに、割りきって
0711デフォルトの名無しさん
2011/07/09(土) 15:53:47.760712デフォルトの名無しさん
2011/07/09(土) 16:44:52.160713デフォルトの名無しさん
2011/07/09(土) 17:03:47.560714デフォルトの名無しさん
2011/07/09(土) 18:45:11.40通信系情報理論本の序論だった。
0715デフォルトの名無しさん
2011/07/09(土) 18:51:34.97ポインタを使って、MSBが立っていたらNULLとするとか。
0717デフォルトの名無しさん
2011/07/09(土) 21:00:50.260718デフォルトの名無しさん
2011/07/09(土) 21:37:57.99完璧な方法は絶対に存在しないけど、使える方法ならある。
例えば、0〜256の整数を識別したいけど、奇数は絶対に扱わない、というのであれば
2で割った値を格納しておいて、使うときに2を掛けるような処理を組めば良い。
結局のところ、8つのビットの組み合わせで表現できる、互いに識別可能な元は256個しかないから
8つのビットを使って257種類の状態を識別することは、鳩の巣原理を用いれば簡単に証明できるように、
理論的に不可能なんだよ。
どんなファイルでも必ず可逆圧縮できるようなアルゴリズムがこの世に存在できないのと理由は同じ。
それと一応>>701に突っ込むと、NULLは16bitだったり32bitだったり36bitだったり64bitだったりするけど
あなたがプログラミングで扱うような尋常なマシンだと通常8bitにはならないから
そんな心配はしなくて良い。
あと、よく知られたテクニックとしては、1byte型へのポインタでも無い限り
ポインタ変数が格納するアドレスのLSBのあたりに情報を乗せない方法があるから、
そこから情報を抜き取って、そこに代わりの情報を埋め込む、という方法がある。
0720デフォルトの名無しさん
2011/07/09(土) 21:45:07.24____
/ \
/ ⌒ ⌒ \
/ (●) (●) \
| 、" ゙)(__人__)" ) ___________
\ 。` ⌒゚:j´ ,/ j゙~~| | | |
__/ \ |__| | | |
| | / , \n|| | | |
| | / / r. ( こ) | | |
| | | ⌒ ーnnn |\ (⊆ソ .|_|___________|
 ̄ \__、("二) ̄ ̄ ̄ ̄ ̄l二二l二二 _|_|__|_
0721デフォルトの名無しさん
2011/07/09(土) 22:29:10.38それが並列にいっぱいあるからだろうから
ランレングスとかで合宿すればよろし
0722デフォルトの名無しさん
2011/07/10(日) 03:23:08.01なんでおでん喰ってんの?
0723デフォルトの名無しさん
2011/07/10(日) 04:23:31.790724デフォルトの名無しさん
2011/07/10(日) 07:53:13.87C++でTMPと実行時、固定長と自由長のがあるといい
0725デフォルトの名無しさん
2011/07/10(日) 11:03:39.360726デフォルトの名無しさん
2011/07/10(日) 11:31:03.57あとは1ビットで100だろうが、8ビットで100万だろうが任意の応用ができる
0727デフォルトの名無しさん
2011/07/10(日) 12:09:21.080728デフォルトの名無しさん
2011/07/10(日) 16:54:48.240729デフォルトの名無しさん
2011/07/10(日) 17:21:20.54float f = (float)((unsigned long int)prev<<48);
f = f + 1.0f;
return (char)((unsigned long int)f>>48);
}
0730デフォルトの名無しさん
2011/07/25(月) 15:30:23.74Zを超えたらAに、Aを超えたらZにしたい場合どうすれば効率よくできますか
0731デフォルトの名無しさん
2011/07/25(月) 15:50:51.720732デフォルトの名無しさん
2011/07/25(月) 15:54:34.88ある意味、自分はバカですといってるようなもん
0733デフォルトの名無しさん
2011/07/25(月) 17:23:41.32どれも環境依存だけど、テーブル使うならこっち
char inc_tbl(char const c) { return "BCDEFGHIJKLMNOPQRSTUVWXYZA"[c-'A']; }
char dec_tbl(char const c) { return "ZABCDEFGHIJKLMNOPQRSTUVWXY"[c-'A']; }
使いたくないならこっち(最近のコンパイラならcmovにしてくれるはず)
char inc_cmov(char c) { ++c; return c>'Z' ? 'A' : c; }
char dec_cmov(char c) { --c; return c<'A' ? 'Z' : c; }
無理やりビット演算するならこっち(もっといい方法はあると思うけどとりあえず)
char inc_bit(char c) { c-= '@'; return (c & ~((char)(c+102)>>7)) + 'A'; }
char dec_bit(char c) { c-= 'B'; return (c ^ ((c^25) & (c>>7))) + 'A'; }
0734デフォルトの名無しさん
2011/07/25(月) 19:47:10.37cmovとかインテルローカルな話はやめろよ
0735デフォルトの名無しさん
2011/07/25(月) 20:03:23.91条件付き移動命令自体はx86に限った話でもないけど
例えばMIPSにもSPARCにもAlphaにもあるし、
ARMやPA-RISCやIA64なんかは移動だけでなくほとんどの命令を条件付き実行できる
0736デフォルトの名無しさん
2011/07/25(月) 20:15:44.91そんな事を言い出したらキリがないぞ。言語すら指定されてないんだから。
それとも世界中の全言語全文字コード全CPU対応のソースでもあるの?はやく出してよ
0737730
2011/07/25(月) 20:29:34.64質問者に難癖つけるだけよりは、第三者にも参考になることもありうるので
よほど有意義だと思うのですが?
>>733
ありがとうございます
3番目みたいなのは面白いですが、もし実装するなら2番目でしょうね
>>734
長い夏休みの暇つぶしに投稿しただけなので
環境はとくに指定しません
0738デフォルトの名無しさん
2011/07/25(月) 20:49:37.42初心者じゃないなら、何やったかぐらい書いたら
0739デフォルトの名無しさん
2011/07/27(水) 11:18:59.11> 質問者に難癖つけるだけよりは、第三者にも参考になることもありうるので
> よほど有意義だと思うのですが?
驚くべき思い上がりだな。
0740デフォルトの名無しさん
2011/07/27(水) 12:20:35.75自分はおこぼれを頂戴してるだけであって物乞いなどしないとでも言いたいのかww
0741デフォルトの名無しさん
2011/07/27(水) 12:38:28.19夏厨への対処の仕方という意味で参考になる。
0742デフォルトの名無しさん
2011/07/27(水) 13:20:00.750743デフォルトの名無しさん
2011/07/29(金) 04:54:23.600744デフォルトの名無しさん
2011/07/29(金) 07:02:31.990745デフォルトの名無しさん
2011/07/29(金) 16:23:51.65inline uint32_t add(uint32_t x, uint32_t y)
{
uint32_t m1 = 0x00ff00ff, m2 = ~m1;
return (((x & m1) + (y & m1)) &m1) | ((x & m2) + (y & m2)) & m2);
}
より効率的な方法はありませんか。
0746デフォルトの名無しさん
2011/07/29(金) 16:47:08.46return ((x ^ y) & 0x80808080) ^ s;
ってのがハッカーのたのしみ2-17にあったよ
0747デフォルトの名無しさん
2011/07/29(金) 18:25:14.97ありがとうございました。
0748デフォルトの名無しさん
2011/07/31(日) 11:21:51.05下位ビットは普通に加算しつつ
最上位ビットの加算のみxorに置き換える事で
繰り上がりを防いでいるわけか
0749デフォルトの名無しさん
2011/08/11(木) 14:29:27.610750デフォルトの名無しさん
2011/08/11(木) 14:39:55.330751デフォルトの名無しさん
2011/08/11(木) 15:01:16.690752デフォルトの名無しさん
2011/08/12(金) 06:42:11.15積みそうな内容だった
イタリック体の数式はダメなんだって
0753デフォルトの名無しさん
2011/08/12(金) 06:53:32.580754,,・´∀`・,,)っ-○○○
2011/08/12(金) 21:27:59.780755デフォルトの名無しさん
2011/08/13(土) 08:14:39.330756デフォルトの名無しさん
2011/08/13(土) 08:15:34.940757デフォルトの名無しさん
2011/08/19(金) 19:31:49.480758デフォルトの名無しさん
2011/08/19(金) 19:40:20.900759デフォルトの名無しさん
2011/08/19(金) 23:17:16.830760デフォルトの名無しさん
2011/08/20(土) 14:23:07.36ってどういう意味?
そういえば
0761デフォルトの名無しさん
2011/08/20(土) 14:27:58.870762デフォルトの名無しさん
2011/08/20(土) 14:30:01.02風流な・・・
0763デフォルトの名無しさん
2011/08/20(土) 18:19:46.48∧_∧
( ´・ω・`) ∧_∧
/ \ ( )何言ってんだこいつ
.__| | .| |_ / ヽ
||\  ̄ ̄ ̄ ̄ / .| | |
||\..∧_∧ (⌒\|__./ ./
||. ( ) ~\_____ノ| ∧_∧
/ ヽ 空気読めよ \| ( )
| ヽ \/ ヽ. オマエ馬鹿だろ
| |ヽ、二⌒) / .| | |
.| ヽ \∧_∧ (⌒\|__./ /
0764デフォルトの名無しさん
2011/08/26(金) 17:08:16.56おれはこんなビット演算してすごい損害出したとか
マ板向きか
0765デフォルトの名無しさん
2011/08/26(金) 20:55:51.67/ _ノ \
| ( ●)(●)
. | (__人__)
| ` ⌒´ノ
. | } ミ ピコッ
. ヽ } ミ /\ ,☆____
ヽ ノ \ \ / \
/ く \. /\/ ─ ─ \ ←>>765
| `ー一⌒) / (●) (●) \
| i´ ̄ ̄ ̄ \ | (__人__) |
\_ ` ⌒´
0766デフォルトの名無しさん
2011/08/26(金) 23:53:47.400767デフォルトの名無しさん
2011/08/27(土) 00:16:24.670768デフォルトの名無しさん
2011/08/27(土) 00:34:53.570769デフォルトの名無しさん
2011/08/27(土) 09:29:04.30自分の心に素直にありたいんだ!
0770デフォルトの名無しさん
2011/09/01(木) 07:59:17.750771デフォルトの名無しさん
2011/09/06(火) 16:24:35.090772デフォルトの名無しさん
2011/09/06(火) 16:27:27.891100000100
0773デフォルトの名無しさん
2011/09/07(水) 03:14:37.620774デフォルトの名無しさん
2011/09/07(水) 03:34:05.450775デフォルトの名無しさん
2011/09/07(水) 16:02:51.580776デフォルトの名無しさん
2011/09/07(水) 16:04:46.340777デフォルトの名無しさん
2011/09/07(水) 16:29:30.970778デフォルトの名無しさん
2011/09/07(水) 16:59:57.910779デフォルトの名無しさん
2011/09/07(水) 17:42:39.630780デフォルトの名無しさん
2011/09/08(木) 14:37:28.790781デフォルトの名無しさん
2011/09/08(木) 19:10:58.200782デフォルトの名無しさん
2011/09/09(金) 01:28:45.540783デフォルトの名無しさん
2011/09/09(金) 01:28:59.380784デフォルトの名無しさん
2011/09/11(日) 00:20:26.250785デフォルトの名無しさん
2011/09/16(金) 16:54:50.080xA0|0xFに見えた
0786デフォルトの名無しさん
2011/09/18(日) 03:11:42.460788デフォルトの名無しさん
2011/09/18(日) 16:20:17.35f(x)=1&x の逆関数を考えてみてくれ
実数から複素数に拡張するように
何かを拡張させてもいいので
0789デフォルトの名無しさん
2011/09/18(日) 18:29:27.550790デフォルトの名無しさん
2011/09/18(日) 19:17:59.53偶数ならBuzz
それ以外ならFizzBuzzと表示させよ
0791デフォルトの名無しさん
2011/09/18(日) 20:03:35.80undo できないよね。計算によって情報が減るというかさ。
計算しつつも元に戻れるような
情報量の減らない論理演算体系が作れないかなぁ
xor は自身が逆関数だからいいよね。(いいかは知らないけどw)
0792デフォルトの名無しさん
2011/09/18(日) 20:08:35.980793デフォルトの名無しさん
2011/09/18(日) 22:31:27.73可逆計算理論を初めて知った。めっちゃ面白い。
ロムるわ。ありがとう。
0794uy
2011/09/19(月) 07:43:58.00こういう何もわかってなくて単語だけ知ってるゴミはどうすればいいんだろうな
>>793
煙に巻かれてるお前もゴミお前なんだけど
マジレスで教えておいてやるけど
量子コンピュータは、「完成しない」
技術的にではなくてね、。
それを作らずとも、人のやりたいことは達成出来るから
ようは速いコンピュータがほしいんだろ
俺はコンピュータの演算速度が-0秒になるところまではみている
0795uy
2011/09/19(月) 07:51:05.46まだ量子コンピュータは遠い
けど作れないことはない
でも、コストや費用的に、「もう作らなくていいんじゃね?w」ってなる
量子コンピュータは世界と世界とを結ぶ原子核を再帰させて
並列処理ではなく再帰を並列にみせかける再帰並列処理をやろうとしてるから
それをやると、複数の世界の「世界」そのものの力を借りた演算速度になる
俺は0秒演算のPCまで出来たら満足だけど、
そこまでやろうとする奴いるかねぇ
数百万年とか、数億年とか、適当な未来予測は普段なら出来るんだけど
量子コンピュータの完成日については、まったく予想が不可能、
もしこれが完成するとしたら、現在いる俺よりもさらに上のスペックをもった奴が、地上に光臨しない限り 作られない
いわば突然変異みたいな感じ
人がアメーバみたいな生き物から、科学発展をさせたあの「奇跡」を、もう一度起こすぞw くらいの確率でしか
量子コンピュータは完成されない 俺であったら2兆年くらいあれば作れるかもしれない
0796uy
2011/09/19(月) 07:55:25.99俺が結婚して、子供を作り
そいつに技術力のすべてを教え込む
それを何世代か繰り返せば、量子コンピュータの短期完成はありえるかもしれない
けど俺は基本的に結婚の予定はないんだけど
0797デフォルトの名無しさん
2011/09/19(月) 10:20:26.740798デフォルトの名無しさん
2011/09/19(月) 10:46:15.960799793
2011/09/19(月) 21:36:58.96可逆計算理論の話ね。
0800デフォルトの名無しさん
2011/09/19(月) 22:07:49.86キモッ
0801デフォルトの名無しさん
2011/12/06(火) 17:25:24.02(x + y) / 2より(x + y) >> 1と書いてある方が何故か安心する
0802デフォルトの名無しさん
2011/12/07(水) 05:45:03.440803デフォルトの名無しさん
2011/12/07(水) 06:10:17.11はい論破
0804デフォルトの名無しさん
2011/12/07(水) 07:37:53.250805デフォルトの名無しさん
2011/12/07(水) 12:46:03.47除算だとその補正のためにcdqとsubが挿入されるね
(x + y) / 2u と書けばシフトと同じコードになる
0806デフォルトの名無しさん
2011/12/07(水) 13:15:49.31-1 / 2 == 0, -1 >> 1 == 1
-3 / 2 == -1, -3 >> 1 == -2
signedを(2^n)で割る演算は基本的に cdq -> sub -> sar になる
cdq, sub は負の場合に+1するため
0807デフォルトの名無しさん
2011/12/07(水) 13:20:32.53x / 2 + y / 2 と書きたくなる
加算でオーバーフローしないのか考えるのはめんどくさい
0808デフォルトの名無しさん
2011/12/07(水) 13:29:26.23オーバーフローせずに平均値を求める: ((x^y)/2)+(x&y)
上でも出てる負数の問題を気にしないなら ((x^y)>>1)+(x&y)
0809806
2011/12/07(水) 13:37:17.04(正) -1 / 2 == 0, -1 >> 1 == -1
0810デフォルトの名無しさん
2011/12/07(水) 17:36:56.35x + y / 2 == x + (y / 2)
x + y >> 1 == (x + y) >> 1
基本的にやめとけ
0811デフォルトの名無しさん
2011/12/08(木) 00:57:45.17int IncBit(int char_code) { retrun 'A' + ++char_code % 26; }
int DecBit(int char_code) { retrun 'A' + --char_code % 26; }
こんなんで十分じゃね。あとはコンパイラが上手いことやるだろ。
>>737
調子に乗るなボケ。
0812デフォルトの名無しさん
2011/12/08(木) 01:00:34.71これ逆の減算をみたことないんだよな
考えてみれば、わりと簡単なのかもしれんけど
0813デフォルトの名無しさん
2011/12/17(土) 01:58:45.38byte INPUT_NOT2=0x17;
byte INPUT_NOT3=0x18;
byte INPUT_NOT4=0x19;
byte INPUT_NOT5=0x20;
byte INPUT_NOT6=0x21;
byte INPUT_NOT7=0x22;
byte INPUT_NOT8=0x23;
byte INPUT_NOT9=0x24;
こんなふうにバイトに値を変換しておくと早く軽くしょりできるのでしょうか?表記は間違ってないでしょうか?
0814デフォルトの名無しさん
2011/12/17(土) 02:25:19.230815デフォルトの名無しさん
2011/12/17(土) 12:01:58.020817デフォルトの名無しさん
2011/12/17(土) 17:18:07.340818デフォルトの名無しさん
2011/12/17(土) 17:30:04.080819デフォルトの名無しさん
2011/12/18(日) 05:14:37.56単なる通し番号でビット位置になってないし・・・
0820>>813
2011/12/18(日) 13:21:42.450821デフォルトの名無しさん
2011/12/18(日) 13:27:15.41それよりどういう事だったのか説明しろ
気になるんだよ
0822>>813
2011/12/18(日) 14:19:42.890824デフォルトの名無しさん
2011/12/18(日) 15:15:43.45まずは変数と定数の区別とか、型変換とくに汎整数拡張についてCの教科書で学んでくれ
0825デフォルトの名無しさん
2012/01/23(月) 03:05:56.740827デフォルトの名無しさん
2012/01/23(月) 05:44:20.140828デフォルトの名無しさん
2012/01/23(月) 05:58:58.560829デフォルトの名無しさん
2012/02/15(水) 04:14:17.00とるやり方を知らなかったので、「前の値との差の絶対値が7以上」 とかのアホな
判定してた。平均をとればLSB付近のばたつき成分が消えるんだよね。
0830デフォルトの名無しさん
2012/02/15(水) 20:10:30.67データの個数がやっぱ必要かな
0831デフォルトの名無しさん
2012/02/15(水) 22:35:08.94データの中身(どう変化するのか)で考えたほうがいいんじゃね
変化量があまりないときは、単純計算できるような
0832デフォルトの名無しさん
2012/02/16(木) 00:49:14.72フィードバック型とか
out=in*0.001+out*0.999;
もしくはダウンサンプルすればいい
if(count<10000){
tmp+=in;
count++;
}else{
out=tmp;
tmp=0;
count=0;
}
0833デフォルトの名無しさん
2012/02/16(木) 19:34:00.47めんごめんご
画像で、でかい範囲の平均化とか一つずれるたびに再計算するのも何だからと思って。
0834デフォルトの名無しさん
2012/02/16(木) 23:02:34.13きょうびググれば分かるんじゃね。
0835デフォルトの名無しさん
2012/02/17(金) 09:14:01.51Cは8か16ぐらい。Cがどの位だとin のばたつきが均されて結果のつきが遅れないか
というあたりがよく解らないままやってたんですが、その辺、なんか助言ください。
>>832の前者と比べて、-outがあることで何が違うのかな?
0836デフォルトの名無しさん
2012/02/17(金) 16:08:23.50非力なマシン使ってた頃ならありかもしれんけど
0837デフォルトの名無しさん
2012/02/17(金) 17:22:14.39ノイズと信号の周波数特性を考えてじゃあどの係数の IIR フィルタを使おう、と決める
でも信号処理は無数にやり方あるし
やりたいことで全然作り方分かる
君の今の情報じゃデータの特性も要求も真っ暗で
全然基本の手法も絞れん
真っ暗闇で相談するより
ググって同じことやってる人見つけて
真似る方が早いよ
0838835
2012/02/18(土) 05:15:39.17出力パワーに反映、わりとゆっくり変化→ゆっくり反映 という感じでした。
使ってみたらよかったかな?と思ったのは、ダイヤル入力A/D10bit→受信周波数
微調整の箇所です。指で回す→周波数の追随が良い、だけどノイズは拾いたくない
ぐらいの条件ですね。作ったハード屋さんはこの入力をこの出力に反映してねしか
言わないんです。
0839デフォルトの名無しさん
2012/02/18(土) 13:10:37.300840デフォルトの名無しさん
2012/02/19(日) 05:21:12.46どれが最適かまではデータみないと絶対わからないし
特定の2手法のどちらが適しているかすらも言えることはない
0841デフォルトの名無しさん
2012/02/19(日) 10:47:09.400842デフォルトの名無しさん
2012/02/19(日) 15:23:13.060843デフォルトの名無しさん
2012/02/19(日) 15:33:14.320844デフォルトの名無しさん
2012/02/19(日) 19:43:55.620846デフォルトの名無しさん
2012/02/20(月) 03:07:48.290847営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 02:32:51.88p.s.
このへんにためてけばよくね?
https://gist.github.com/gists/search?q=bit-manipulation
0848営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 15:25:40.82a^=t;
b^=t;
これでいけるかな?
0849営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 16:04:16.89ただこれが例えばソートの中とかで使われるなら
比較結果は偏るので予測が効いて単純な分岐の方が速くなる可能性が高い
さらにaとbがメモリにあったりすると分岐を排除したら常にストアが発生して具合が悪かったりする
0850デフォルトの名無しさん
2012/04/13(金) 22:47:51.39という13個のビット列を周期的に繰り返して得たいのですが、
下よりコストの少ない方法がありましたら教えてください。
main() {
uint8_t bit, bitcount;
bitcount = 0;
bit = 0x49; // 0b01001001;
for ( ; ; ) {
if (bit & 1) {
// 1の処理
} else {
// 0の処理
}
bit >>= 1;
if (++bitcount == 13) { // リセット
bitcount = 0;
bit = 0x49; // 0b01001001;
}
}
}
>>850 専ブラ用
0851デフォルトの名無しさん
2012/04/13(金) 23:12:49.36for ( ; ; ) {
if (bit & 1) {
// 1の処理
bit |= 1 << 13;
} else {
// 0の処理
}
bit >>= 1;
}
とかどう
0852デフォルトの名無しさん
2012/04/13(金) 23:23:36.190853デフォルトの名無しさん
2012/04/13(金) 23:25:22.67おおおおお!かなりよさそうです。
ありがとうございました!
0854デフォルトの名無しさん
2012/04/13(金) 23:30:28.100855デフォルトの名無しさん
2012/04/14(土) 01:07:43.71//0の処理
//0の処理
//0の処理
//0の処理
//0の処理
//0の処理
//1の処理
//0の処理
//0の処理
//1の処理
//0の処理
//0の処理
//1の処理
}
0856デフォルトの名無しさん
2012/04/14(土) 11:41:03.940857デフォルトの名無しさん
2012/04/14(土) 14:21:09.24>>850も>>851も埋め込んでると思うが
なんなら>>855のアセンブラを生成してからそこにジャンプするようにすれば良くね?
0858デフォルトの名無しさん
2012/04/14(土) 14:33:54.720859デフォルトの名無しさん
2012/04/14(土) 14:40:03.86別スレ行って説教した方がいいんじゃないの?
0860デフォルトの名無しさん
2012/04/14(土) 14:42:58.080861デフォルトの名無しさん
2012/04/14(土) 15:01:35.90uint8_tは8bitだから
bit |= 1 << 13;
はダメですぞ
0862デフォルトの名無しさん
2012/04/14(土) 15:58:36.63<bit |= 1 << 13;
>bit = 0x49;
で
0863デフォルトの名無しさん
2012/04/14(土) 20:06:57.390864デフォルトの名無しさん
2012/04/14(土) 21:44:37.23ビットが11個しかない件について
元の値を壊すと大変だからコレでいいんじゃね?
uint_fast16_t const bits = 0x49; // ビット列(下位13ビットが有効)
for(uint_fast16_t mask = 1; mask & 0x1fff; mask<<=1) {
if(bits & mask) {
// ビットが1の時の処理
} else {
// ビットが0の時の処理
}
}
最初からビット列を左右反転しておけば僅かに速いかもしれない
uint_fast16_t const bits = 0x1240; // ビット列(下位13ビットが有効)
for(uint_fast16_t mask = 0x1000; mask ; mask>>=1) {
if(bits & mask) {
// ビットが1の時の処理
} else {
// ビットが0の時の処理
}
}
0865デフォルトの名無しさん
2012/04/14(土) 21:48:34.10> 13個のビット列を★周期的に繰り返して★得たい
0866デフォルトの名無しさん
2012/04/14(土) 22:18:08.630867デフォルトの名無しさん
2012/04/14(土) 22:35:09.57>★下よりコストの少ない方法★ がありましたら教えてください。
全体をforで囲むのは>>850と本質的に同じ
uint8うんぬん以外は>>851でいいと思うんだけどねえ
0868デフォルトの名無しさん
2012/04/14(土) 23:31:47.640869デフォルトの名無しさん
2012/04/15(日) 00:22:00.51>>851氏の方法で解決しましたが、bitのuint8_tは、
たまたま00001001001が8bitの範囲に収まる値だったからで、
状況によっては10101010101だったり、ビット列が増えたりなんてことも
ありえましたので、あまり気にしないでください。
0870864
2012/04/15(日) 01:52:34.81ベンチマークしてた&寝ちゃったので遅くなってゴメンよ〜
<VC++2010 64bit> 1位:864の下
2位:851(1位との差は多分気にする程じゃない)
3位:864の上(2位との差は多分気にする程じゃない)
<VC++2010 32bit> 1位:864の下
2位:851(1位との差は多分気にする程じゃない)
3位:864の上(遅すぎ。多分レジスタが足りなくなった)
<mingw-gcc 64bit>
1位:864の下(一番内側のループが13個のパターン化したmovに置換され超高速。ifの中身が簡単すぎたかも)
2位:864の上(一番内側のループが13個のパターン化したmovに置換され超高速。ifの中身が簡単すぎたかも)
3位:851(1位2位の約4倍遅い、VC64/32の1位より僅かに速い。)
<mingw-gcc 32bit> mingw-gcc 64bitと同じ
864の上はVC32bitで遅すぎてダメ。
864の下は速いけどビット列を反転して用意しなければならない。
gccの最適化を期待するなら864のどちらでも。
851は最適化はあまり期待できないけれど、どのコンパイラでも遅くなる事は無い。gccでの結果は気にしないで。
<結論>851でOK
ってここまで書いて置いたら「ビット列が増えたりなんてことも...」
>>869 そういう事は早く言えww
ソースおいとくので暇な人は実行してみて(汚い&無駄になったケド)
http://ideone.com/S1zzg
0871デフォルトの名無しさん
2012/04/15(日) 02:10:44.080872デフォルトの名無しさん
2012/04/15(日) 02:23:55.14if の中身が簡単じゃないとそもそもボトルネックにならんだろうよ
0873864
2012/04/15(日) 06:30:40.83蒸し返すっていうかポツポツ話が続いていたので便乗してみただけ。ただしコストを下げるって事に
過敏に反応してしまったのは悪かったけど。
>>872
「ifの中身が簡単すぎるとボトルネックにならない」って意味でいいんですよね?
それはその通りでgccでは差が出すぎてしまったので、その結果は採用せずに851氏(今まで氏を付け
てなかったスミマセン)のコードでという結論になりました。
以下駄文というかスレチですので無視して結構です>>>
何故864を書いたのかというと851氏のはビットが 1 の場合演算が1回増える&依存関係があるので
コンパイラの最適化(アンロール)に支障が出てしまうと思ったからです。アンロールできれば
実行コストが下がり有利になる(最後のシフト命令が省略できる等)はずでしたが、結果が余りにも
極端すぎたのとifの中身の処理が大量にあった場合アンロールされなくなり、逆に不利になる場合も
あるので通常は851氏の考え方でいいんじゃないかという気がします。
汎用性が無いとダメとの事なので意味無かったんですが、依存関係を無くすとか、左右反転してみる
とかの工夫は実行コストを下げるという意味において大事だと思ってます。考え方古いかな。
0875デフォルトの名無しさん
2012/04/16(月) 00:00:06.25そして当該処理が簡単な時は実行時に>>855を動的生成するようなコードを書いてそれに jmp すればよろし
0876デフォルトの名無しさん
2012/04/16(月) 00:09:40.100877デフォルトの名無しさん
2012/04/16(月) 03:18:16.980878デフォルトの名無しさん
2012/04/16(月) 04:00:46.420879,,・´∀`・,,)っ-○○○
2012/04/20(金) 08:12:48.71こういうのはどうだろ?
static const unsigned int bits_org = 0x80000049;
static const unsigned int mask = 0xFFF80000;
unsigned int bits = bits_org;
for (;;) {
if (bit & 1) { /* 1の処理 */ }
else { /* 0の処理 */ }
bits = bits >> 1;
bits = (bits & mask)? bits : bits_org;
}
x86なら論理積で条件フラグ更新するのはtest命令だけでできる。
強いて言うならビット逆転しておいたほうがいいと思うよ。右シフトより加算の方が速いCPUのほうが多いはずだし。
0880デフォルトの名無しさん
2012/04/20(金) 09:08:47.02スレの空気が引き締まったな
0881デフォルトの名無しさん
2012/06/23(土) 10:34:30.16ttp://ocw.ouj.ac.jp/tv/1542109/08.html
0882デフォルトの名無しさん
2012/06/23(土) 10:43:06.20岡部先生もおまえみたいな見境のない信者にはうんざりだろう。
いいかげんにしとけ。
0883デフォルトの名無しさん
2012/06/23(土) 10:49:57.740884デフォルトの名無しさん
2012/06/23(土) 20:05:18.140885デフォルトの名無しさん
2012/06/24(日) 14:46:44.710886uy
2012/06/25(月) 16:38:51.34xorだけですませる為の分かりやすいサンプルください
0887デフォルトの名無しさん
2012/06/25(月) 18:48:31.850888デフォルトの名無しさん
2012/06/26(火) 13:33:35.020889デフォルトの名無しさん
2012/06/26(火) 13:52:30.690890デフォルトの名無しさん
2012/06/26(火) 17:19:27.800891デフォルトの名無しさん
2012/06/26(火) 17:38:23.410892uy
2012/06/26(火) 18:21:16.280893デフォルトの名無しさん
2012/06/26(火) 22:33:57.530894uy
2012/06/28(木) 14:31:12.57さっさと死んでおけよゴミ共
0895デフォルトの名無しさん
2012/06/28(木) 20:13:00.610896デフォルトの名無しさん
2012/06/28(木) 20:14:46.210897デフォルトの名無しさん
2012/06/28(木) 20:33:18.13あまり怒らせない方がいい
0898デフォルトの名無しさん
2012/06/29(金) 00:06:52.77(a+b-(a^b))>>1
とかやっていいなら話は別だけど。
0899デフォルトの名無しさん
2012/06/29(金) 12:15:19.200900デフォルトの名無しさん
2012/06/29(金) 12:38:29.46C(out) = A・B + (A + B)・C(in)
が
C(out) = ~P・A・B + P・C(in)
になるそうですが
C(out) = A・B + P・C(in)
じゃだめなんですか?
0901デフォルトの名無しさん
2012/06/29(金) 13:41:04.790902デフォルトの名無しさん
2012/06/29(金) 16:30:24.14結局
A&B | (A|B)&C
を
A&B | (A^B)&C
にしてるだけだから、何の利点もない
オペランドが片方だけ真になるときはxorはorの代用として使える、というだけの自明な話
0903デフォルトの名無しさん
2012/06/29(金) 18:12:17.87どうしてわざわざ無駄なことをしているのでしょう?
0904デフォルトの名無しさん
2012/06/29(金) 18:14:17.850905uy ◆pdu1UZmweE
2012/07/02(月) 05:45:22.98無理じゃないよ
実際に最近俺がそういうコードを書いてしまったが
読み解くのが面倒だったから聞いただけ
むしろ逆に
or and でかける範囲のアルゴリズムのいくつかをxorで置き換えられるってだけな気がするけど
0906デフォルトの名無しさん
2012/07/05(木) 04:35:27.74A or B は、xorとandのorで、xorとandは補集合だからここのorはxorでも同じ。
A or B = not(A xor B) xor (A xor B) これで合ってる?
0907デフォルトの名無しさん
2012/07/05(木) 06:30:48.57間違ってる
0908デフォルトの名無しさん
2012/07/05(木) 06:36:03.78まずは A=0, B=0 ね。
0909デフォルトの名無しさん
2012/07/05(木) 13:54:42.73ベン図なんて見なくていいから真理値表を見よう。
--
A B AorB AandB AxorB ~A ~B C<-~AandB D<-Aand~B CorD
0 0 0 0 0 1 1 0 0 0
0 1 1 0 1 1 0 1 0 1
1 0 1 0 1 0 1 0 1 1
1 1 1 1 0 0 0 0 0 0
0910デフォルトの名無しさん
2012/07/06(金) 07:53:22.72逆はできるけど
0911デフォルトの名無しさん
2012/07/06(金) 09:53:23.78どうやって証明できます?
0912デフォルトの名無しさん
2012/07/06(金) 12:00:03.330913デフォルトの名無しさん
2012/07/06(金) 12:25:51.28また、前項と後項が異なる場合(以下条件2)も同じ結果(1)になる。
条件1で前項を否定(not)すると条件2になり、やはり同じ結果(但し値は1)になる。
条件2でも同様に条件1になり、これまた同じ結果(但し値は0)になる。
勿論前項を否定する代わりに後項を否定しても、全く同様の結果になる。
and/or/nand/norを生成するためには条件1か条件2のどちらかで結果が異ならないといけない。
何故ならばこれらの演算では条件1で値が異なるし、仮に前項を否定した場合も条件2で値が異なる。
にも拘らず、xorとnotだけでは条件1或いは条件2で値が異なる状況を生成できない。
従って、xorとnotだけではand/or/nand/norが生成できない。
0914デフォルトの名無しさん
2012/07/06(金) 12:49:43.440915913
2012/07/06(金) 12:55:02.94つーか、私にゃ無理w
0916デフォルトの名無しさん
2012/07/06(金) 13:21:31.08A xor B
not (A xor B)
以外に
not A
not B
が作れるだろ
だから何でも作れるのが正解
0917デフォルトの名無しさん
2012/07/06(金) 13:30:12.350918デフォルトの名無しさん
2012/07/06(金) 13:31:05.14何故「だから何でも作れる」なのか
0919デフォルトの名無しさん
2012/07/06(金) 13:36:21.070920デフォルトの名無しさん
2012/07/06(金) 21:25:28.64温かく迎えてやれ
0921デフォルトの名無しさん
2012/07/06(金) 21:43:01.990922デフォルトの名無しさん
2012/07/06(金) 21:44:29.63なんだか階層構造があるみたいだな。数学で既に誰か考察してそうだが。
0923デフォルトの名無しさん
2012/07/06(金) 21:48:25.360924デフォルトの名無しさん
2012/07/07(土) 16:31:07.330925デフォルトの名無しさん
2012/07/07(土) 17:03:38.97素通し、いつも0、いつも1、NOT。
NOTは、もう一段NOTで「素通し」にできる。
「いつも0」「いつも1」は、どちらか片方とNOTがあれば、もう片方にもなる。
2入力、1出力の関数は全部で16個
NAND、NOR、~A AND B、~A OR B、A AND ~B、A OR ~B の 6 個が、
それ1個で他のどれも作ることができる。
AND、ORは、他にNOTを組み合わせる必要がある。
XORとNXOR(XNOR)は自己双対なので、組み合わせて他の論理を
作ったりはできない(常に1とか常に0なら作れるけど)。
今ざっと考えてみたところそんな感じだと思う。
0926デフォルトの名無しさん
2012/07/07(土) 19:27:52.54http://www1.axfc.net/uploader/Sc/so/360310.pdf
0927デフォルトの名無しさん
2012/07/07(土) 19:29:24.61表にちょっと誤りがあるわ←おっちょこちょい
0928デフォルトの名無しさん
2012/07/07(土) 19:36:02.24修正入れた。
0929デフォルトの名無しさん
2012/07/07(土) 21:30:12.13乙。
0930デフォルトの名無しさん
2012/07/08(日) 00:44:40.130931デフォルトの名無しさん
2012/07/08(日) 00:45:39.940932926
2012/07/08(日) 02:00:05.83本当なら一々式変形やって、「ほら、(not (A xor B)) xor A = not Bはいつも正しいでしょ?」とかって片っ端から言う所。
0933デフォルトの名無しさん
2012/07/08(日) 07:47:24.490934デフォルトの名無しさん
2012/07/08(日) 09:09:26.600935uy ◆Qe4wwDKtLk
2012/07/11(水) 17:37:38.19^ と ! から
完璧な | と完璧な & 作れとか言ってねーからさ
どこで何を勘違いしたんだ、
特定ケースのみでいいから正しく動作するサンプルをね、所望していたわけだけど
もう自分のソース解析して大体理解したからもういいよこの雑魚スレ
&と|を^で置き換えるショートコーディングの技術解説してるのをどっかで見たんだけどな
そのころはまだ自分が絶対記憶能力を持つ前だから忘れてるわ
0936デフォルトの名無しさん
2012/07/11(水) 17:50:25.36> xorだけですませる為の分かりやすいサンプルください
これを
> ^ と ! から特定ケースのみでいいから正しく動作するサンプルを所望
と読める人はいないよ
0937デフォルトの名無しさん
2012/07/11(水) 17:55:47.89触らない方がよかった…
0938デフォルトの名無しさん
2012/07/11(水) 18:13:10.050939デフォルトの名無しさん
2012/07/11(水) 18:38:10.330940デフォルトの名無しさん
2012/07/12(木) 00:50:50.830942デフォルトの名無しさん
2012/07/12(木) 02:52:23.99にほんごは ただしく せいかくに かつ じゅうぶん ぐたいてきな かたちで つかいましょう。
日本語に限った話じゃないし、プログラマならなおさらそうするべきなんだがな。
0943uy ◆Qe4wwDKtLk
2012/07/12(木) 23:50:19.92つって、勘違いしたままいらねーもん開発してる典型じゃん
この流れ
謝れ
0944デフォルトの名無しさん
2012/07/13(金) 07:48:07.38わざわざ要求を不正確に伝えてきたのはそっちじゃんよ。
俺は目の前にある仕様を正しく表現した。俺の仕事は全うし、責任は果たされた。
謝れ
0945デフォルトの名無しさん
2012/07/13(金) 19:12:10.37わけだね。
0946デフォルトの名無しさん
2012/07/13(金) 23:19:36.100947,,・´∀`・,,)っ-○○○
2012/07/14(土) 11:35:51.860948uy
2012/07/14(土) 13:55:03.52人は再帰にはもっと弱い
人は二進数にも弱い
0949,,・´∀`・,,)っ-○○○
2012/07/14(土) 15:20:59.600950uy
2012/07/14(土) 15:46:35.260951デフォルトの名無しさん
2012/07/14(土) 15:49:55.35uyはゴミ
0953デフォルトの名無しさん
2012/07/14(土) 16:20:22.840954デフォルトの名無しさん
2012/07/14(土) 16:46:17.930955uy
2012/07/14(土) 17:26:36.92さっさと謝っとけよ
0956デフォルトの名無しさん
2012/07/14(土) 20:44:57.980957デフォルトの名無しさん
2012/07/15(日) 15:23:26.430958デフォルトの名無しさん
2012/07/15(日) 16:38:17.61「ゴルフできるレベル=必要最低限の技量」だと思ってる人。
いや確かにショートコーディングはそれ単体で深みのある分野なんだけどさ。
「and」が「少なくとも両方共tの時tになる二項一般論理演算」か何かを指すと思い込んで
説明なしに使った挙句指摘されて逆切れするってのは
ゴルフが出来るとか、ポインタや再帰を超高速で扱えるとか、
半年ごとに新しく言語を実装する過程でバッククォートカンマアットの最も簡潔な実装方法について半年おきに同じように悩んだりとか、
去年は最初のセクタに置くことにしていたブートストラップを、El Toritoの規格に合わせるように18セクタ目あたりに移す作業を休日の暇潰しにやったりとか、
あるいは自作の言語や自作のOSに関する話をGoogleのサマーインターンシップへの面接中に楽しんだ挙句
六本木ヒルズ森ビル26階でC言語系の某コンパイラの改造に取り組んでその夏を過ごしたりとか、
そういう技術レベルに関わる以前の問題なんだけどなぁ。
物質的でないもの、形のないものを扱う職業なんだから、
伝える時は「誰が読んでもそうとしか取れないように」書き、
受け取る時はその事を前提にして「誰が読んでもそうとしか取れなかったように」読むもんだと思うんだけど。
0959デフォルトの名無しさん
2012/07/15(日) 16:49:43.900960926=958 ◆tAo.kQ2STk
2012/07/15(日) 16:58:49.950961デフォルトの名無しさん
2012/07/15(日) 19:01:38.28この流れの中でいらねーもん開発したのはお前だけだけどな。
0962デフォルトの名無しさん
2012/07/16(月) 13:39:53.75とりあえず素案
【分割統治法】ビット演算 0x04
0963デフォルトの名無しさん
2012/07/16(月) 23:09:17.65ちょっと調べたらコンパイラのバージョンで判定してて、
直接的に __builtin_clz の有無を判定できるようなマクロはないみたいだけど。
0964デフォルトの名無しさん
2012/07/17(火) 02:43:46.25autoconf 使いたくないならハンネにyuって書けよ
0965デフォルトの名無しさん
2012/07/17(火) 09:59:23.24まさか、「ハンドルネーム」なんていう間違った表現を更に短縮して
悦に入っている馬鹿とも思えないし、なんか意味があるの?
それはさて、「yu」ってのも判らんが……
0966デフォルトの名無しさん
2012/07/17(火) 10:48:48.60それとも「ホームページ」に始まり「時計皿」やら「催眠術」やら「性癖」やら、その類の
間違って訳されたか、間違って使われることが多い用語に片っ端から突っ込まないと気が済まないわけ?
俺は別に構わないんだけど、やったことがある立場から言わせてもらうとただただ疲れるだけだぜ?
※時計皿は観察する(watch)皿の誤訳、催眠術は該当する語が無かった時代に研究者が見学して「眠気を催す術だ」と誤解したことから、性癖は生来の「性質」からくる癖のこと。
yuってのは多分uyの事なんだろうなぁ。
0967デフォルトの名無しさん
2012/07/17(火) 12:26:17.010968デフォルトの名無しさん
2012/07/17(火) 13:01:30.930969デフォルトの名無しさん
2012/07/17(火) 13:41:18.93uy並の脳の壊れ具合。
0970966
2012/07/17(火) 15:04:13.17ど田舎から電話回線でチャットしてた日も、10年近く前の事になるのか。
語彙も変わるわけだ。
0971デフォルトの名無しさん
2012/07/17(火) 15:11:51.7410年前はもう光化してたな
0972デフォルトの名無しさん
2012/07/17(火) 22:08:22.080973デフォルトの名無しさん
2012/07/18(水) 01:05:47.630974デフォルトの名無しさん
2012/07/18(水) 11:30:00.310975デフォルトの名無しさん
2012/07/18(水) 11:45:51.19これみたいで格好わるいお
0976デフォルトの名無しさん
2012/07/18(水) 12:01:34.770977デフォルトの名無しさん
2012/07/18(水) 12:06:42.010978デフォルトの名無しさん
2012/07/18(水) 12:22:13.48むかごみたいになるんだよな
0979uy
2012/07/25(水) 08:39:59.80俺思うんだけど、
最適化などを手動で行う事もなくなってきた今
このビット演算を現代で最も使ってるのはゴルフだろうに
このスレってずいぶんおかしな流れになってんのな
ビット演算をゴルフ以外のどこで使ってるんだよ
まさか変数情報関連の「簡単な初期化」にしか使ってないとかいわないよな
そういうレベルで火病っているなら死ね
0980デフォルトの名無しさん
2012/07/25(水) 11:31:03.82「誤解を招かない言い方をしろ」を長々と言っただけ。
重箱の隅を楊枝でほじくるのが楽しいのはよくわかるが
0981デフォルトの名無しさん
2012/07/25(水) 18:13:50.04> 最適化などを手動で行う事もなくなってきた今
おめーはそういう仕事してないからな。
ていうか、よく恥ずかしげもなく書き込みできるよな。
できるよな。
0982デフォルトの名無しさん
2012/07/25(水) 18:39:10.19お蔭様で、どこにregister宣言つければスタック消費量を抑えられるかなんていう
くだらん経験値が増えちまったw
0983デフォルトの名無しさん
2012/07/25(水) 19:02:38.41ワークステーションだろうがメインフレームだろうが同じ。
0984982
2012/07/26(木) 01:22:56.14無意味なループは消滅させたりするだけの最適化できるコンパイラ使っているんだけどね。
依頼元のソースにvolatileがなかったから、最適化禁止の理由も判るってもんだ。
0985デフォルトの名無しさん
2012/07/26(木) 01:50:51.93技巧的なビット演算と同じ物を
最適化で実現できるかと言われると微妙なところ
もちろん本来的に、最適化コンパイラが十分な性能のコードを吐けるなら
それで何の問題もないはずではあるのだが
レス数が950を超えています。1000を超えると書き込みができなくなります。