【高速化】ビット演算 0x02 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
06/09/16 09:46:26
前スレ
ビット演算
スレリンク(tech板)


関連スレ
アセンブラ… (゜□゜) ↑アッー!↓
スレリンク(tech板)


関連情報
Hacker's Delight
URLリンク(www.hackersdelight.org)

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか
URLリンク(www.amazon.co.jp)

ビットを数える・探すアルゴリズム
URLリンク(www.nminoru.jp)

Bitboard
URLリンク(en.wikipedia.org)

2:デフォルトの名無しさん
06/09/16 09:47:52
    /ノ 0ヽ
   _|___|_  下がってろウジ虫共!
    ヽ|・∀・|ノ     訓練教官のようかんマン先任軍曹が2getだ!
    |__|
     | |

>>1 貴様!俺のかんてんをどうするつもりだ!
>>3 あんこを入れる前と後に「サー」と言え!
>>4 ふざけるな!茶をだせ!茶っ葉落としたか!
>>5 貴様にはふやけたもなかをかき集めた値打ちしかない!
>>6 異人の手先の駄カステラめ!
>>7 まるでそびえ立つ葛だ!
>>8 栗を切り取って貴様の価値を絶ってやる!
>>9 お茶請けにもなれないゼリー風情が気取った事を言うな!
>>10-999 虎だ!虎になれ!虎屋のようかんを思い出せ!
>>1000 気に入った!家に来て俺を食っていいぞ!

3:デフォルトの名無しさん
06/09/16 09:48:26
    ∧
    < | >     俺はグラットン持ちの通りすがりのナイトであって
    |.|.|              3getしたがどうやってブロントって証拠だよ!!
    |.|.|
    |.|.|
    < | >      おいィ?お前それで良>>1のか? 
   ...| | |.      仏の顔を>>2度までという名セリフを知らないのかよ
   ...| | |.      暗黒が持つと逆に頭がおかしくなって>>4
   ...| | |.      グラットンす>>5いですね
    .< .| .>     >>6駄にaguるなネットポリスに捕まりたいのか?
 /(.._..|..|..|.._..)ヽ   それほどでも>>7
 >.─<>─.<   このままでは俺の寿命がストレスでマッ>>8なんだが・・
 ヾ ̄ヾ .√ ")'   >>9枚で良い
    .| .|      俺の怒りが有頂>>10になった
    .| .|
    .| .|      おれパンチングマシンで>>100とか普通に出すし
      ) (
    .▽

4:デフォルトの名無しさん
06/09/16 10:15:14
廃人向けビット演算の知識を扱うスレはここですか?

5:デフォルトの名無しさん
06/09/16 11:47:09
団子(◆DanGorION6)はWEBページからデータを自動収集して会話する人工無能なので
必要なコピペを引き出したらあとは放置しましょう。
待機モード中の自動応答に本気でレスすると、無駄にログが流れ読みにくくなりますし
他の利用者の妨げになります。

6:デフォルトの名無しさん
06/09/16 17:48:57
>>1
乙です

7:デフォルトの名無しさん
06/09/16 18:00:34
Java使っててもたまにお世話になるから侮れん。

8:デフォルトの名無しさん
06/09/18 08:19:25
 *     +    巛 ヽ
            〒 !   +    。     +    。     *     。
      +    。  |  |
   *     +   / /   イヤッッホォォォオオォオウ!
       ∧_∧ / /
      (´∀` / / +    。     +    。   *     。
      ,-     f
      / ュヘ    | *     +    。     +   。 +
     〈_} )   |
        /    ! +    。     +    +     *
       ./  ,ヘ  |      このスレッドは1000を超えました。
 ガタン ||| j  / |  | |||        次スレも…BITクオリティ!!
――――――         URLリンク(pc8.2ch.net)

って1000取ろうとしたらすっかり忘れてた。

9:デフォルトの名無しさん
06/09/18 11:56:32
何はしゃいでるんだか。
こういう奴死んでくれないかな。

10:デフォルトの名無しさん
06/09/19 07:48:09
age

11:デフォルトの名無しさん
06/09/21 22:57:17
age

12:デフォルトの名無しさん
06/09/22 01:51:44
>>8
取れてるじゃん。

13:デフォルトの名無しさん
06/09/22 23:28:21
オセロで空白位置 m に打ったときに返るパターンを取得するプログラムで
分岐を使わないのができた

uint64 wh = white & 0x7e7e7e7e7e7e7e7e; // 横移動のための番人
uint64 rev = 0;
uint64 e1, e2, e3, e4, e5, e6; // 空白から続く白石列
uint64 b1, b2, b3, b4, b5, b6; // 黒石から続く白石列
e1 = (mask0 <<1) & wh;
e2 = (e1 << 1) & wh;
e3 = (e2 << 1) & wh;
e4 = (e3 << 1) & wh;
e5 = (e4 << 1) & wh;
e6 = (e5 << 1) & wh;
b1 = (black >> 1) & wh;
b2 = (b1 >> 1) & wh;
b3 = (b2 >> 1) & wh;
b4 = (b3 >> 1) & wh;
b5 = (b4 >> 1) & wh;
b6 = (b5 >> 1) & wh;
rev |=
e1 & b1 |
e1 & b2 | e2 & b1 |
e1 & b3 | e2 & b2 | e3 & b1 |
e1 & b4 | e2 & b3 | e3 & b2 | e4 & b1 |
e1 & b5 | e2 & b4 | e3 & b3 | e4 & b2 | e5 & b1 |
e1 & b6 | e2 & b5 | e3 & b4 | e4 & b3 | e5 & b2 | e6 & b1;

14:デフォルトの名無しさん
06/09/22 23:29:29
↑は 右方向だけのコード。他の7方向についても同様

だけど、条件分岐を使って書いたコードよりかなり遅い
もっと高速化できないものか

15:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
06/09/22 23:46:53
分岐を排除すれば早くなるなんてのは200段くらいのキチガイパイプライン
でもない限りありえない。
2項選択くらいならconditional move使えば簡単に表現できる。

x86ならレジスタ数が少ない上に32ビットレジスタ2本でようやく1つの64ビット値だから
それだとロード・ストアが頻発して全然速くない。
へたに1マス1ビットに割り振るよりは1バイトに振ったほうが小回りが利く分速くなることもある。


16:デフォルトの名無しさん
06/09/22 23:50:43
最後の部分は
rev |=e1 & (b1 | b2 | b3 | b4 | b5 | b6) |
e2 & (b1 | b2 | b3 | b4 | b5) |
e3 & (b1 | b2 | b3 | b4) |
e4 & (b1 | b2 | b3) |
e5 & (b1 | b2) |
e6 & b1;
とすれば、論理演算の回数を 42 から 26回に減る
さらに or の部分をまとめれば
rev |= e6 & b1;
rev |= e5 & (b1 |= b2);
rev |= e4 & (b1 |= b3);
rev |= e3 & (b1 |= b4);
rev |= e2 & (b1 |= b5);
rev |= e1 & (b1 | b6);
論理演算の回数は 17回

17:デフォルトの名無しさん
06/09/23 00:08:41
WORD単位の方が速いことも多いような。

18:デフォルトの名無しさん
06/09/23 00:13:59
そういうの考慮したベンチマークとかシミュレーションとか
AMD が出してたのがあるような気がするけどなんだっけ…

19:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
06/09/23 00:59:58
x86の演算は基本的に2オペランドベースで破壊的。
つまり
  src1 = func(src1, src2)

src1の値を保存したい場合は待避が必要になる。
レジスタ間移動

20:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
06/09/23 01:05:29
失礼

レジスタ間移動だけでも整数の論理算術演算と同様にクロック数と
演算ユニットを使うし、ロード・ストアが絡むとさらに遅延が大きくなる。

x86でこの手の最適化をやる場合、テンポラリ変数をなるべく多用しない
(32ビットで同時に3〜4くらいに抑えるべき)のと、全部 &= や |= で
書いてみれば、吐き出される命令数が最低どのくらいになるかは
見当がつくと思う。

21:デフォルトの名無しさん
06/09/23 07:59:35
下記のように書き換えれば、使用変数が減る
uint64 wd = white & 0x007e7e7e7e7e7e00;//斜め移動のための番人
uint64 rev = 0;
uint64 e1, e2, e3, e4, e5, e6;//空白から続く白石列
uint64 b1;//黒石から続く白石列
e1 = (m << 9) & wd;
e2 = (e1 << 9) & wd;
e3 = (e2 << 9) & wd;
e4 = (e3 << 9) & wd;
e5 = (e4 << 9) & wd;
e6 = (e5 << 9) & wd;
rev |= e6 & (b1 = (black >> 9) & wd);
rev |= e5 & (b1 |= (b1 >> 9) & wd);
rev |= e4 & (b1 |= (b1 >> 9) & wd);
rev |= e3 & (b1 |= (b1 >> 9) & wd);
rev |= e2 & (b1 |= (b1 >> 9) & wd);
rev |= e1 & (b1 | (b1 >> 9) & wd);

22:デフォルトの名無しさん
06/09/23 08:01:25
e1〜e6 は高々1ビットだけがセットされているので、
e6 = (m << 6*6) & wd;
とし、
rev |= e6 & (b1 = (black >> 9) & wd);
rev |= (e6>>=6) & (b1 |= (b1 >> 9) & wd);
としてもよさそうだが、一度にシフトすると番人を飛び越してしまうのでよろしくない


23:デフォルトの名無しさん
06/09/27 04:29:00
結局は子供の遊びだな

24:デフォルトの名無しさん
06/09/27 06:33:35
子供が遊びでこんなことをするとは恐ろしい時代になったんだな。

25:デフォルトの名無しさん
06/09/27 09:22:57
子供の遊びを大人がやっているだけだろ。

26:デフォルトの名無しさん
06/09/27 13:18:53
大人の遊びを子供がやる時代だから。


27:デフォルトの名無しさん
06/09/27 19:57:00
つかお前らも子供の頃MSXBASICからマシン語打ち込んだり
ニーモニック丸暗記して作ったプログラムに独自のチェックサムモドキつけたりして
紙に書いてセーブしてワクワクしてただろ。

大人はそんな無駄でアホな事まずやらねぇ

28:デフォルトの名無しさん
06/09/27 22:52:33
ビットボードによるオセロの話

A1, B1, ... H1 などの横一列の状態を一意の数字(インデックス)に変換し、
あらかじめ作成しておいたテーブルを引きたい
マスの状態は白黒空の3種類なので、空:0,黒:1,白2として 3倍しながら値を足していけば
インデックスを計算できる。

#define isB(p) ((black&p)!=0)
#define isW(p) ((white&p)!=0)
#define V(p) (isB(p) ? 1 : isW(p) ? 2 : 0)
#define INDEX8(p1, p2, p3, p4, p5, p6, p7, p8)\
(((((((V(p1)*3+V(p2))*3+V(p3))*3+V(p4))*3+V(p5))*3+V(p6))*3+V(p7))*3+V(p8))

INDEX8(A1, B1, C1, D1, E1, F1, G1, H1);

この処理をビット演算を使って、華麗に高速に行う方法はないのでしょうか?

29:デフォルトの名無しさん
06/09/28 07:42:57
1マスが2ビット(黒:01, 白:10, 空:00)で、8マス分の情報が下位16ビットに並んでいれば
分割統治法が使えそうだ

t = x & 0xcccc; x = (x & 0x3333) + (t >>= 1); x += t >>2;
t = x & 0xf0f0; x = (x & 0x0f0f) + (t >>= 3); x += t >> 4;
t = x & 0xff00; x = (x & 0x00ff) + (t >>= 7); x += t >> 8;

論理演算 6回、シフト 6回、加算 6回

3倍して足していく方法は、乗算 7回、加算7回 なので、少し速そう

30:デフォルトの名無しさん
06/09/28 08:12:34
t = x & 0xcccccccc; x = (x & 0x33333333) + (t >>= 1); x += t >> 2;
t = x & 0xf0f0f0f0; x = (x & 0x0f0f0f0f) + (t >>= 3); x += t >> 4;
t = x & 0xff00ff00; x = (x & 0x00ff00ff) + (t >>= 7); x += t >> 8;
ix1 = x >> 16;
ix2 = x & 0xffff;

とすれば、2行分のインデックスを同時にもとめることができる。
64ビット変数を使えば4行分をまとめて計算できる。
それならかなり高速になりそう

しかし、ビットボードは白黒別々なので、それを2ビットごとにまとめなくてはいけない
その処理に時間がかかりそうだ


31:デフォルトの名無しさん
06/09/28 08:34:46
2ビットごとにまとめる処理は、いわゆるシャフルだ
下位32ビットについて、

b = black & 0xffffffff;
b = ((b & 0xffff0000) << 16) | (b & 0xffff);
b = ((b & 0xff00ff00ff00) << 8) | (b & 0xff00ff00ff);
b = ((b << 4) | b) & 0x0f0f0f0f0f0f0f0f;
b = ((b << 2) | b) & 0x3333333333333333;
b = ((b << 1) | b) & 0x5555555555555555;

で間に0を入れ、白も同様に処理し、

x = b | (w << 1);

とすれば、2ビットごとにまとめることができる。
あとは >>30 の処理を行えば、下4行分のインデックスが求まる。


32:デフォルトの名無しさん
06/10/06 12:00:35
>>29
間違ってない?

33:デフォルトの名無しさん
06/10/06 13:43:55
ビット演算だけで四則演算ってできるの?


34:デフォルトの名無しさん
06/10/06 22:17:36
それはギャグで言ってるのか

35:デフォルトの名無しさん
06/10/08 11:28:06
加算器って基本はビット演算だそ。

回路図や真理値表は以下のページにあるぞ。
Wikipedia項目リンク

いわゆるCPUだとかマイクロ・プロセッサつーのは、
その奥深くに 加算器に演算レジスタがあって、
ノイマン型にプログラム通りに計算をするためのものなんだから。

減算 や 負の数を扱うには「2の補数」
Wikipedia項目リンク
と言った捉え方で数を扱うのだ。

36:デフォルトの名無しさん
06/10/08 11:38:50
ビット演算だけで発明ってできるの?

37:デフォルトの名無しさん
06/10/10 23:41:36
ビット演算があれば、何でもできる。

38:デフォルトの名無しさん
06/10/10 23:46:16
ビット演算ができれば、僕にも彼女ができたりしますか?

39:デフォルトの名無しさん
06/10/10 23:49:48
当たり前。

40:デフォルトの名無しさん
06/10/10 23:51:57
or and not があれば全ての演算ができる?

41:デフォルトの名無しさん
06/10/10 23:57:28
NANDがあれば、何でもできる。


42:デフォルトの名無しさん
06/10/10 23:58:38
NORでもいいぞ

43:デフォルトの名無しさん
06/10/11 00:21:23
わかってないな

44:デフォルトの名無しさん
06/10/11 01:00:10
元気ががあれば、何でもできる。

45:デフォルトの名無しさん
06/10/11 01:01:30
行けば分かるさ


46:デフォルトの名無しさん
06/10/11 02:06:14
やっぱ、NANDとNORのハイブリットが良い?

47:デフォルトの名無しさん
06/10/11 06:57:09
Trががあれば、何でもできる。

48:デフォルトの名無しさん
06/10/11 13:16:09
Magic Algorithm
URLリンク(aggregate.org)




49:デフォルトの名無しさん
06/10/11 16:56:33
>>48
ひょっとしてradiumあたりで見た輩か?
>>1のサイトでとりあげられてる。
せめて>>1のサイトくらいみればよいのに・・・

50:デフォルトの名無しさん
06/10/11 23:15:53
C++やJavaだとどちらかというと保守性重視だから
性能改善要求出る前にビット演算使うと白い目で見られる。

51:デフォルトの名無しさん
06/10/11 23:18:57
>>50
例え処理が1行だけであっても、関数(インラインで良い)にしとけば文句でないはず。

52:デフォルトの名無しさん
06/10/11 23:26:39
>>51
勿論明瞭なコメント付きでな。

53:デフォルトの名無しさん
06/10/11 23:36:36
>>51
ついでに代替コードを書いておくとなお良い。

54:デフォルトの名無しさん
06/10/13 04:27:35
ゴリゴリのチューニングが求めらるような場面でもなければ、たいていはコンパイラの最適化だけで事足りるわけだが。

55:デフォルトの名無しさん
06/10/13 05:31:51
スクリプトでマスかいてろ

56:デフォルトの名無しさん
06/10/13 09:38:47
>>54
確かにそれで文句が出ないどころかメンテしやすければ褒められるべきところではあるが
多少の遊び心があってもそれはそれで許される。
>>51-53のようなことをしてあれば。
(代替コードのテストも必要なことは当然なので、プログラマの負担はアップするが)

57:デフォルトの名無しさん
06/10/13 13:48:49
ビット演算による最適化が必要で
パフォーマンス的に代替が効かないからこそ
そういうコードを書くわけだから
同等以上の速度が出た上に読みやすいコードを出せなければ
批難する事はできない。

もちろん意味もなくビット演算するアホの話は別として。

58:デフォルトの名無しさん
06/10/13 16:28:36
でも普通インラインアセンブラ使うよね。そういうビット演算だと。
上で出てるようなCでなんて書かないよ。

59:デフォルトの名無しさん
06/10/13 16:34:33
いや、俺はループアンローリングだとかプロセッサのスケジューリング管理
なんか考えたくないからC言語で書くけどね。
まぁ、どうしてもビット回転(rotate)が必要ならインラインアセンブラの
使用も検討するが。

60:デフォルトの名無しさん
06/10/13 16:41:08
インラインアセンブラはアセンブラとは違うよ

61:デフォルトの名無しさん
06/10/13 18:52:45
>>60
いや、当たり前の事実を主張されてもなぁ。
しかもなぜにこのタイミングで?わけわからん。

62:デフォルトの名無しさん
06/10/13 21:02:46
>>60
何が違うの?

63:デフォルトの名無しさん
06/10/13 21:26:25
ものほんのアセンブラならそもそも命令セットの数が違うみたいな?

64:デフォルトの名無しさん
06/10/13 23:34:07
なんつー理屈だ。

寧ろインラインアセンブラだとCコード部とのI/Fが簡単に書けるメリットはあるね。

65:デフォルトの名無しさん
06/10/14 00:47:40
ネイティブアセンブラ
 C言語との連携は関数呼び出しの形でのみによって実現される。
 殆どのメモリアクセスはシンボルではなくオフセット値での指定となるからめんどい。
 最適化の善し悪しはすべて自分の腕にかかっている。

インラインアセンブラ
 Cのソースに埋め込むことが出来るので、必要な箇所を個別に関数化する必要がない。
 関数内の局所変数にシンボリックにアクセスできる。
 一部のコンパイラはインラインアセンブラで書いた箇所も勝手に最適化してくれやがる。

66:デフォルトの名無しさん
06/10/14 00:56:32
スレ違いだ。他所でやれ。

67:デフォルトの名無しさん
06/10/17 13:52:46
論理演算部分をインラインアセンブラ化するのに、
どうして「プロセッサのスケジューリング管理」なんて話が出てくるのか誰か教えて!

68:デフォルトの名無しさん
06/10/17 16:26:53
「プロセッサのスケジューリング管理」の意味はわかっているか?

69:デフォルトの名無しさん
06/10/17 17:04:37
大方タイムスライスと勘違いしているんだろうけど。

70:デフォルトの名無しさん
06/10/17 17:27:16
>>67
パイプラインでな、処理を円滑に進めるためには、命令の実行順序を適切に
並び替える必要があるんだ。命令実行順序の決定をスケジューリングという。
命令実行スケジューリングはふつうコンパイラが最適化の一環として施すが
インラインアセンブラで記述した部分はそのままの順序で出力されて最適化
されないことが多い。

71:デフォルトの名無しさん
06/10/26 23:04:23


72:デフォルトの名無しさん
06/10/30 22:09:37
あげ

73:デフォルトの名無しさん
06/10/30 22:39:25
テンプレにある
>ハッカーのたのしみ
は、アマゾンで評価が高いみたいですが
本当に読んで面白い本なんですか?

74:デフォルトの名無しさん
06/10/30 22:47:16
>>73
それはお前がビット演算を楽しめるかどうかによる。

75:デフォルトの名無しさん
06/10/31 03:09:00
>>73
もしもあなたが書き溜めたソースコードを持っているのなら…

76:デフォルトの名無しさん
06/11/15 19:13:21
ビット演算で絶対値を求めることってできますかね?
条件分岐をしないで絶対値を求めたいのですが…

77:デフォルトの名無しさん
06/11/15 20:26:02
>>76
このへん見てみたら?
URLリンク(www.thescripts.com)

78:デフォルトの名無しさん
06/11/15 21:53:55
int y=x>>31;
return (x^y)-y;
か。
今ならcmovのほうが速いだろうけど

79:デフォルトの名無しさん
06/11/15 22:56:58
ふーむ…
とりあえずリンク先を参考に試してみようと思います
ありがとうございました

80:デフォルトの名無しさん
06/11/26 15:29:11
age

81:デフォルトの名無しさん
06/12/02 22:52:42
age

82:デフォルトの名無しさん
06/12/03 07:55:42
とにかく徹底的にif文使いたくないんだけど、
根本的に排除する方法ってないんですか?
こういう場合はできるよってのがあったらそれも知りたいです。
もうビット演算のこと以外考えたくないんです。

83:デフォルトの名無しさん
06/12/03 08:40:06
>>82
論理回路にif演算器はない。

84:デフォルトの名無しさん
06/12/03 08:40:31
if(a){
 x;
} else {
 y;
}



switch(a){
default:
 x;
 break;
case 0:
 y;
}

85:デフォルトの名無しさん
06/12/03 08:50:26
じゃあ僕は条件分岐と一生付き合わなきゃいけないんですか?
一生、縁が切れないんですか??
もう勘弁しいてほしいんです。
ソース読みにくいのってみんなif文の所為じゃないですか。
この絶望のまま生きていたくない。

並列計算がうまくいかないのだってきっと条件分岐のせいですよ。
諸悪の根源と思っていますよ、もう。

ところで、論理シフトとかってあれは論理演算が関係してるんですか?

86:デフォルトの名無しさん
06/12/03 09:38:32
if(a>b){
 x=c;
} else {
 x=d;
}

x=(a>b)*c;
x+=!(a>b)*d;

こんな感じかな?
ビット演算じゃ無いけど


87:デフォルトの名無しさん
06/12/03 10:20:41
if(a){
 x;
} else {
 y;
}



n_if(a){
 x && a || y && !a;
}

88:デフォルトの名無しさん
06/12/04 17:34:01
平凡にジャンプテーブル
void f();
void g();
int hoge;

  before:
if (hoge != 0)
  f();
else
  g();

  after:
typedef (*func_t)();
func_t table[] = {f, g};
table[hoge != 0]();

89:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
06/12/04 22:59:51
関数コールのペナルティ>>>分岐予測ミスのペナルティ


d = a ? b : c;

とかでも使えば?組み込みのCMOV命令に展開してくれたりするし
SIMD系の命令セットは比較命令はマスク生成のことが多い


90:デフォルトの名無しさん
06/12/04 23:03:57
P4だと、テーブル参照方式はペナルティが信じられんほど凄い。
命令20ぐらいをズラスラ書いたのより、テーブル参照1つの方が遅かったりする。

91:デフォルトの名無しさん
06/12/07 00:04:36
最近それ経験した。
switchで振り分けた方が遥かに速かったわ。恐るべし分岐予測。

92:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
06/12/07 00:39:10
>>82はPS3かなんかの開発やらされてるゲームプログラマなんじゃね?

93:82
06/12/11 04:57:32
もうジャンプするのも嫌になりました。
if文なしのジャンプなしで何とかならないでしょうか??

94:デフォルトの名無しさん
06/12/11 18:38:36
てきとーに制限つけてその条件内で考えさせたいだけでしょ。

95:デフォルトの名無しさん
06/12/18 22:14:18
age

96:デフォルトの名無しさん
06/12/25 20:04:45
sub a, b
adc pc, a


97:デフォルトの名無しさん
06/12/30 23:15:58
あげ

98: 【大吉】
07/01/01 00:23:58
あけまして、おめでとうごzぁいます

99:デフォルトの名無しさん
07/01/01 13:31:16
要は皆さんパズル好きだと

100:デフォルトの名無しさん
07/01/03 13:42:06
プログラミング自体が、言語変わってもパーツの組合せのパズルに過ぎない訳で。

101:デフォルトの名無しさん
07/01/03 19:31:35
>>82
>根本的に排除する方法ってないんですか?
>こういう場合はできるよってのがあったらそれも知りたいです。

ビット演算以外の仕事は「引き受けない」


102:デフォルトの名無しさん
07/01/03 23:21:49
>82
まずプロセッサから設計した方がいいんじゃないか

103:デフォルトの名無しさん
07/01/04 00:46:05
>>93
cmp+jeの組み合わせがいやならsub+jneでどうだろうか。

104:デフォルトの名無しさん
07/01/06 15:01:25
Cです
int i;として
iが0以外なら1を、iが0なら0を返すビット演算は
i!=0以上にコンパクトにできるのでしょうか?
n = i!=0;と括弧つけてもやや読みづらいので。
(bool)iならば可読的なので喜んで使いたいのですが、Cなので残念ながら…

105:デフォルトの名無しさん
07/01/06 15:03:57
!!i
なんてどう?

106:デフォルトの名無しさん
07/01/06 21:00:27
typedef enum{false, true} bool;

(bool)i


107:デフォルトの名無しさん
07/01/06 22:58:09
問題は、Cではenum型にキャストした値がenum値に制限されるかどうかだね。

108:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
07/01/06 23:02:40
めんどくさい
#define TO_BOOL(x) ((x) != 0)

109:デフォルトの名無しさん
07/01/06 23:04:45
阿呆なマクロを使うくらいなら>105でいいじゃん。

110:デフォルトの名無しさん
07/01/06 23:07:38
>>108
C、C++の最適化について語るスレ
スレリンク(tech板)

団子ちゃん、↑こっちのスレの結果はどうなったの?
やっぱり、団子ちゃんが適当なこと吹いてただけなの?

111:デフォルトの名無しさん
07/01/07 07:00:18
っつーかどうしても1にしたい状況ってそんなないだろ
0/!0で充分だから


112:デフォルトの名無しさん
07/01/07 22:11:55
ビット演算でも高速化でもないな。

113:デフォルトの名無しさん
07/01/14 00:16:55
#define BITTOENNZANN(dayo) ((dayo)!=0)

これでビット演算だお^ω^

114:デフォルトの名無しさん
07/01/18 00:08:57
>>33
加算器ってこんな感じじゃない?(ちょっと冗長かも)

int ADD(int x, int y, int c) {
return (x | y | c) ?
(((x & 1) ^ (y & 1) ^ (c & 1))
| (ADD(x >> 1, y >> 1,
(( !(x & 1) & (y & 1) & (c & 1))
| ( (x & 1) & !(y & 1) & (c & 1))
| ( (x & 1) & (y & 1) & !(c & 1))
| ( (x & 1) & (y & 1) & (c & 1)))) << 1)) : 0;
}

誰か減算器↓


115:デフォルトの名無しさん
07/01/18 00:48:41
int ADD_(int x,int y){return x?ADD_((x&y)<<1,x^y):y;}
int ADD(int x,int y,int c){return ADD_((x&y)<<1|c,x^y);}
int SUB(int x,int y,int c){return ADD(x,~y,c^1);}

116:デフォルトの名無しさん
07/01/18 16:58:05
>>109
! がオーバーロードされてたら、二回も呼ばれることになるぜ。

117:デフォルトの名無しさん
07/01/19 01:20:26
オーバーロードまで考慮したら ! 二回より != の方が遅いことも
十分ありえるけどな。

118:デフォルトの名無しさん
07/01/19 14:36:23
64bitのビットを数えるのは外出?

119:デフォルトの名無しさん
07/01/19 18:41:42
>>118
ビットを数えるってのがよくあるpop関数のことなら死ぬほど既出。



120:デフォルトの名無しさん
07/01/23 07:38:25
あげ

121:デフォルトの名無しさん
07/01/23 10:19:53
レス4は絶対ここの住民だろ笑
スレリンク(tech板)l50

122:デフォルトの名無しさん
07/01/26 23:52:21
>>121
こいつのせいでビット操作のスレになってるじゃないか

123:デフォルトの名無しさん
07/01/29 12:22:02
ビット演算でbranch freeなmagic incrementは可能かね?

124:デフォルトの名無しさん
07/02/12 18:20:58
Bit Twiddling Hacks
URLリンク(graphics.stanford.edu)
こんなサイトが(英語だけど)
テンプレに入れる?

125:デフォルトの名無しさん
07/02/12 21:33:10
入れるのはいいけど、それまで続くんか?

126:デフォルトの名無しさん
07/02/12 22:46:32
コンパイル時には>>124をテンプレとしてオーバーライドします。

127:デフォルトの名無しさん
07/02/13 07:43:07
もうこのスレも息切れみたいだね。

128:デフォルトの名無しさん
07/02/13 23:14:23
だいたいビット演算ごときでときめいちゃうのは厨房までだろw
煽りぬきで

129:デフォルトの名無しさん
07/02/13 23:51:38
ていうか、パズルみたいなもんだろ。

さすがに、ネタ切れにて閉店でいいと思うよ。

130:デフォルトの名無しさん
07/02/15 15:02:08
よほど要求速度や省メモリがシビアな環境でない限りは妙な小細工はたいして必要ないもんね

131:デフォルトの名無しさん
07/02/15 15:47:08
int i = 20070215;

で、この i からそれぞれ 2007, 2, 15 って数字が欲しいんだけど
誰かカッコ良くビット演算使ってやってください。


132:デフォルトの名無しさん
07/02/15 15:50:34
>>131
実質的には除数固定で割り算を行うのと同じだから
割り算の話になるな。

133:デフォルトの名無しさん
07/02/15 16:48:06
0x20070215

134:デフォルトの名無しさん
07/02/15 16:53:01
>>131-133
それすごくもったいなくないか

たしか
日:1-31 (5bit)
月:1-12 (4bit)
年:00-99 (7bit)

で 16bit っつー表記があったな
FDとかHDのタイムスタンプとか

今なら年だけ
0000-9999 (14bit)
でも 23bit で余裕な訳だが



135:デフォルトの名無しさん
07/02/15 17:03:23
>>134
そんなところでビットをケチったってしょうがねぇべさ。
そのフォーマット(MS-DOSのFATだな)はタイムスタンプが2秒単位でしか記録できないしね。
#hour:5, minute:6, second:5

136:デフォルトの名無しさん
07/02/16 03:33:47
ねえ偉い人
10進数を3進数に変換するコードはJAVAでどう書きますか?

137:デフォルトの名無しさん
07/02/16 03:46:47
↑バカ

138:デフォルトの名無しさん
07/02/16 14:24:00
イマイチビット演算はよくわからん

139:デフォルトの名無しさん
07/02/16 15:18:45
ビット演算してると脳汁が出る

大抵は無意味だけど
オナニーとしてはナカナカそそる

140:デフォルトの名無しさん
07/02/16 15:28:21
ビット演算って1や0にするだけじゃん。

141:デフォルトの名無しさん
07/02/16 15:35:59
だが、それがいい。

142:デフォルトの名無しさん
07/02/16 15:55:53
3|17 2
3| 5 2
  1

10進数:17 -> 3進数:122

10進数から3進数への変換て、これであってる?

143:デフォルトの名無しさん
07/02/16 15:59:57
なんかboost::randomの使い方が良く分からないので
extern boost::mt19937 brand;
inline const float&n_rand(){
static float x;
*((unsigned int*)&x)=(brand()&0x7FFFFF)|0x3F000000;
return x;
}
とかやってる俺はkusobaka

144:デフォルトの名無しさん
07/02/16 20:57:54
うわっバカだ

staticいらないだろ。

145:デフォルトの名無しさん
07/02/16 23:56:47
bitマスクとかメンドクサイから言語レベルでbitの配列みたいに扱える
演算子があれば良いんだけどな。
STLやboostを使っても型変換が必要だし。



146:デフォルトの名無しさん
07/02/16 23:58:08
ビットフィールド?

147:デフォルトの名無しさん
07/02/17 00:00:30
static を除去するなら、戻り値は const float & ではなく float にすべきでもある。
ところで、乱数の範囲はそれでいいのか?
2進表現で0x3f800000 から 0x3fffffff にして、そこから 1.0f を引くと [0..1) になって使いやすいと思うが。

148:デフォルトの名無しさん
07/02/17 01:31:32
floatの表現がIEEEに合致するってのは保証されてるんだっけ?


149:デフォルトの名無しさん
07/02/17 01:54:26
うんにゃ、されてない

150:デフォルトの名無しさん
07/02/17 08:36:23
だが、それがいい

151:デフォルトの名無しさん
07/02/18 21:02:06
32bitのエンディアンの変換てどうすればいい?

152:150
07/02/18 21:13:28
ごめん、よく考えたら大したことなかった。
これでOKだ。
x = ( ( x >> 8 ) & 0x00ff00ff ) | ( ( x << 8 ) & 0xff00ff00 );
x = ( ( x >> 16 ) & 0x0000ffff ) | ( ( x << 16 ) & 0xffff0000 );

153:デフォルトの名無しさん
07/02/19 09:11:59
単に
x = (x & 0x000000ff) << 24 | (x & 0x0000ff00) << 8
| (x & 0x00ff0000) >> 8 | (x & 0xff000000) >> 24;
と書いては何かまずいの?

152の方法だと1行目で算出したxを2行目で使っているので
1行目の処理と2行目の処理の並列性が無いし、マスク用の
定数が4バイトの2つ、3バイトの1つ、2バイトの1つで、
どのCPUを想定しているのかは知らないけど、普通は
上の方法のマスク定数より長いコードになるのでは。

24回のshiftが16回のshiftより時間がかかる状況なら
上の方法は好ましくないし、エンディアン変換のビット長が
64bitなら152の方法のほうが良いように思うが。


154:デフォルトの名無しさん
07/02/19 18:34:24
普通に共用体でやった方がエレガントで早いと思いますが。。

155:デフォルトの名無しさん
07/02/19 21:49:23
正直これでいいや。
URLリンク(msdn2.microsoft.com)(VS.80).aspx

156:デフォルトの名無しさん
07/02/20 21:52:40
>>155
?


157:デフォルトの名無しさん
07/03/01 22:52:20
あげ

158:デフォルトの名無しさん
07/03/21 06:17:18
任意のビット数のシフトやローテートてなんで1クロックで実行できねーの?
連続した場合ね。

159:デフォルトの名無しさん
07/03/22 00:34:10
1024bitとか?

160:デフォルトの名無しさん
07/03/22 08:22:35
そもそも1クロックで実行っていつの時代のどのCPUの話だよ
30年前の8bit時代から頭の中進歩してないオジサマ丸出しだねw

しかも昔の8bitマイコンだって命令サイクルと実クロックは別物だしね

161:デフォルトの名無しさん
07/03/22 21:47:22
なんか言いたいんだろうけど、何を言いたいのかさっぱりわからん。

知ったか厨の典型だな。(w

162:デフォルトの名無しさん
07/04/07 02:22:12
あげ

163:デフォルトの名無しさん
07/04/29 08:20:14
a

164:デフォルトの名無しさん
07/04/29 10:38:15
1Bit CPUの可能性について語れないのは素人。

165:デフォルトの名無しさん
07/04/29 10:44:47
cmos 4000 シリーズの事か?

166:デフォルトの名無しさん
07/04/29 10:52:16
MC14500 か

167:デフォルトの名無しさん
07/04/29 12:29:58
コネクションマシンか?


168:デフォルトの名無しさん
07/04/29 18:46:24
バイトの縛りがうざいんだよ

169:デフォルトの名無しさん
07/04/30 02:15:38
22時以降はダメとか?

170:デフォルトの名無しさん
07/04/30 07:39:02
ざぶんとん

171:デフォルトの名無しさん
07/05/03 20:17:24
>どっちかのbitが立ってることを確認するために
>if(hoge & 0x000000C0)
>みたいな書き方出来ると思うのですが
>両方のbitが立ってることを確認したければ
>if(hoge & 0x000000C0 == 0x000000C0)
>って書くしか方法ないですか?

以下から正しいものを選べ

1) if(hoge & 0x000000C0 & 0x000000C0)
2) if((hoge & 0x000000C0) & 0x000000C0)
3) if(!((hoge & 0x000000C0) ^ 0x000000C0))
4) if((hoge & 0x00000080) && (hoge & 0x00000040))
5) if(~(hoge | ~0x000000C0))
6) if(~(~hoge | ~0x000000C0))


172:デフォルトの名無しさん
07/05/03 20:20:41
(hoge & 0x000000C0) == 0x000000C0 が一番速いだろう。

173:デフォルトの名無しさん
07/05/03 20:30:47
#include <stdio.h>

#define MASK 0x0000C0C0

int bittesta(int hoge)
{
if((hoge & MASK) == MASK){
return 1;
}else{
return 0;
}
}

int bittestb(int hoge)
{
if(!((hoge & MASK) ^ MASK)){
return 1;
}else{
return 0;
}
}

int main(int ac, char **av)
{
int hoge = 1234;
bittesta(hoge);
bittestb(hoge);
return 0;
}

174:デフォルトの名無しさん
07/05/03 20:31:55
_bittesta:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
andl $49344, %eax
cmpl $49344, %eax
jne L10
movl $1, -4(%ebp)
jmp L9
L10:
movl $0, -4(%ebp)
L9:
movl -4(%ebp), %eax
leave
ret
_bittestb:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
andl $49344, %eax
cmpl $49344, %eax
jne L13
movl $1, -4(%ebp)
jmp L12
L13:
movl $0, -4(%ebp)
L12:
movl -4(%ebp), %eax
leave
ret

175:デフォルトの名無しさん
07/05/03 20:34:17
>>172 が正解なんだけど
いまどきのコンパイラは
>>171 (3) で書いても
最適化されて >>172 になってるんだね

176:デフォルトの名無しさん
07/05/03 22:06:56
ど素人です。質問があります。

例えば1か0が格納される変数(Aと仮定)のスイッチ切り替えの場合

【例@】
if(A == 1)
{
A = 0;
}
else
{
A = 1;
}

【例A】
A = A ^ (0 + 1);

この場合早いのはやはり例Aなのでしょうか?

177:デフォルトの名無しさん
07/05/03 22:13:48
A ^= 1;

が速い。まあ、例2と同じだあな。

178:デフォルトの名無しさん
07/05/03 22:18:35
>>177
有難うございました。

179:デフォルトの名無しさん
07/05/03 22:24:42
SUBR #n    Acc = n-Acc を持ってるCPUだと
A = 1-A 

のが速かったりするぞ


180:デフォルトの名無しさん
07/05/04 00:48:43
>>177,179
いや、今回は1と0で設定されてるけどほんとは3と5かもしれないだろ
そういう場合ってやっぱA ^= 1;とかA = 1-Aより

A ^= (3 + 5);のほうが正解なんじゃないか?

1と0ならA = 1-Aとかでもいいんだけどな

181:・∀・)っ-○◎●
07/05/04 00:52:14

A ^= 8;
????????????????????????????


Aには1か0が格納されるって最初の条件で確定してるんだが

182:180
07/05/04 00:53:56
>>181
汎用性を高めるって意味だよ

183:・∀・)っ-○◎●
07/05/04 00:55:14
いや8はおかしいだろ常識的に考えて

184:180
07/05/04 00:55:36
A変数に1か0だけの設定なら

A ^= 1;でいいと思うが

A変数に3か5が入ってる設定だと

A ^= 5;じゃダメだろ?

だったらどちらにでも応用できる

A ^= (1 + 0);
A ^= (5 + 3);

がいいんじゃないかって話をしたかっただけだ。

185:・∀・)っ-○◎●
07/05/04 00:56:41
8じゃ最下位ビットはトグルできません><

186:180
07/05/04 00:59:14
じゃあ7だこの野郎

187:・∀・)っ-○◎●
07/05/04 00:59:43
ちなみに俺の回答は
A = ~A;

188:デフォルトの名無しさん
07/05/04 01:01:02
工エエェェ(´д`)ェェエエ工

189:180
07/05/04 01:01:45
俺は今赤面しながら画面に張り付いてるwwwwwwwwww
確かに8じゃ無理だったwwwwwwwww

190:・∀・)っ-○◎●
07/05/04 01:24:45
>>187だと「1」にならないね。
仮に全ビット使う場合の話。
信号制御用の1ビットレジスタをこれで操作してたような。


0か1かならこっちのほうが素直か
A = !A;

191:デフォルトの名無しさん
07/05/04 01:59:07
3 と 5 のトグルなら A ^= 6; だな。
要するに A ^= (3 ^ 5);

192:デフォルトの名無しさん
07/05/04 08:32:25
拡張して 0,1,2 のトグル a=(a+1) % 3 とか 0〜9 での循環a=(a+1) % 10とかになると途端に難しくなるな



193:デフォルトの名無しさん
07/05/04 08:50:20
WORD wに0x0001が含まれていて0x0010が含まれてない、の結果をBOOL bに納める式は
どう書くと一番短いですか?

194:デフォルトの名無しさん
07/05/04 08:52:03
b = (w & 0x0011) == 0x0001;

195:デフォルトの名無しさん
07/05/04 08:59:54
if ((w && 0x0001) == 0x0001)
{
if ((w && 0x0010) != 0x0010)
{
b = TRUE;
}
else
{
b = FALSE;
}
}

196:デフォルトの名無しさん
07/05/04 09:05:23
>>194
ありがとん

197:デフォルトの名無しさん
07/05/04 09:17:53
a:= a +1;
a:= (a+ (a shr 2) ) and 3;

これだと 1,2,3の循環になるな

198:デフォルトの名無しさん
07/05/04 12:09:44
A ^= (3 ^ 5);

199:デフォルトの名無しさん
07/05/04 12:19:48
1001
1000
0000
0001
0011
0010
0110
0100
0101
0111


200:デフォルトの名無しさん
07/05/04 12:21:58
       ヾ  /    < 仮面ライダー555が>
      ,. -ヤ'''カー、   /Y⌒Y⌒Y⌒Y⌒Yヾ
ー―ァ  /r⌒|:::|⌒ヾ
  _ノ オ{(  |0|  )} オオオォォォォ!!!!!
    __,ヽ,ヾ,_|V|,_ノ、/ ,r-,,=
   ,゛==ゝ_ViV_ノ~i/ 〃 `ー―-、
   /  /⌒`//´⌒c/^^^ ))))))))))
,,―イ  {ー''"~{ {~゛`ー`/'`'~/ー--―'
))   ,./ゝ_/∧ゝ_ノ  ノ
ー''"  |ロ  ロ    |
人,_,人,_,人,_,人,_,人,_,
<適当な番号をゲット!!>

201:デフォルトの名無しさん
07/05/04 15:08:21
あまり適当な番号には見えない件について

202:デフォルトの名無しさん
07/05/04 16:12:03
0xC8

203:デフォルトの名無しさん
07/05/04 16:43:42
丁度256円になります。

204:デフォルトの名無しさん
07/05/04 16:47:10
ポイントはお付きしますか?

205:デフォルトの名無しさん
07/05/04 16:50:33
いいえ、彼はペンです。

206:デフォルトの名無しさん
07/05/05 02:12:41
char v;
if(v){ ..... }

vのビット列が [10000000] と [00000001]
ではやっぱり前者の方が早いんだろうか

207:デフォルトの名無しさん
07/05/05 02:21:08
最適化や前後のループや分岐予測によるだろ…常識的に考えて…

208:デフォルトの名無しさん
07/05/05 02:37:55
嫌な答え方だな

209:デフォルトの名無しさん
07/05/05 03:18:03
感じないわ。

210:デフォルトの名無しさん
07/05/05 03:39:36
痛くないわ。


211:デフォルトの名無しさん
07/05/05 11:01:09
五寸釘はイヤだろ・・・・常考

212:デフォルトの名無しさん
07/05/05 11:21:15
ごっすんごっすん五寸釘ー

213:デフォルトの名無しさん
07/05/05 12:16:52
そっちかよクソ

214:デフォルトの名無しさん
07/05/06 17:55:55
あいーん


215:デフォルトの名無しさん
07/05/14 21:23:54
効率的では無いけど少々トリッキーなJavaのコード。数列の解説は面倒なので略。

float[] p = {
0.000f, 0.000f, 1.000f, 5.373f, 0.000f, 0.998f, 4.989f, 0.000f, 1.075f, 5.000f, 0.000f, 0.000f,
0.000f, 5.373f, 0.998f, 4.865f, 4.865f, 0.951f, 4.970f, 2.370f, 1.160f, 5.000f, 1.326f, 0.000f,
0.000f, 4.989f, 1.075f, 2.370f, 4.970f, 1.160f, 3.700f, 3.700f, 0.179f, 4.473f, 2.598f, 0.000f,
0.000f, 5.000f, 0.000f, 1.326f, 5.000f, 0.000f, 2.598f, 4.473f, 0.000f, 3.536f, 3.536f, 0.000f,
};
float[] q = new float[384];
int i,j,k;
for(i=0;i<8;i++) {
k = (((i>>>2)^(i>>>1)^i)&1)*12;
for(j=0;j<16;j++) {
q[i*48+j*3+0] = ((i&1)==0)?p[(j^k)*3+0]:-p[(j^k)*3+0];
q[i*48+j*3+1] = ((i&2)==0)?p[(j^k)*3+1]:-p[(j^k)*3+1];
q[i*48+j*3+2] = ((i&4)==0)?p[(j^k)*3+2]:-p[(j^k)*3+2];
}}
for(i=0;i<32;i++) {
for(j=0;j<12;j++) { System.out.printf("%+6.3ff,",q[i*12+j]); }
System.out.print("\n");
}

216:215の出力結果(1/2)
07/05/14 21:26:12
+0.000f,+0.000f,+1.000f,+5.373f,+0.000f,+0.998f,+4.989f,+0.000f,+1.075f,+5.000f,+0.000f,+0.000f,
+0.000f,+5.373f,+0.998f,+4.865f,+4.865f,+0.951f,+4.970f,+2.370f,+1.160f,+5.000f,+1.326f,+0.000f,
+0.000f,+4.989f,+1.075f,+2.370f,+4.970f,+1.160f,+3.700f,+3.700f,+0.179f,+4.473f,+2.598f,+0.000f,
+0.000f,+5.000f,+0.000f,+1.326f,+5.000f,+0.000f,+2.598f,+4.473f,+0.000f,+3.536f,+3.536f,+0.000f,
-0.000f,+5.000f,+0.000f,-1.326f,+5.000f,+0.000f,-2.598f,+4.473f,+0.000f,-3.536f,+3.536f,+0.000f,
-0.000f,+4.989f,+1.075f,-2.370f,+4.970f,+1.160f,-3.700f,+3.700f,+0.179f,-4.473f,+2.598f,+0.000f,
-0.000f,+5.373f,+0.998f,-4.865f,+4.865f,+0.951f,-4.970f,+2.370f,+1.160f,-5.000f,+1.326f,+0.000f,
-0.000f,+0.000f,+1.000f,-5.373f,+0.000f,+0.998f,-4.989f,+0.000f,+1.075f,-5.000f,+0.000f,+0.000f,
+0.000f,-5.000f,+0.000f,+1.326f,-5.000f,+0.000f,+2.598f,-4.473f,+0.000f,+3.536f,-3.536f,+0.000f,
+0.000f,-4.989f,+1.075f,+2.370f,-4.970f,+1.160f,+3.700f,-3.700f,+0.179f,+4.473f,-2.598f,+0.000f,
+0.000f,-5.373f,+0.998f,+4.865f,-4.865f,+0.951f,+4.970f,-2.370f,+1.160f,+5.000f,-1.326f,+0.000f,
+0.000f,-0.000f,+1.000f,+5.373f,-0.000f,+0.998f,+4.989f,-0.000f,+1.075f,+5.000f,-0.000f,+0.000f,
-0.000f,-0.000f,+1.000f,-5.373f,-0.000f,+0.998f,-4.989f,-0.000f,+1.075f,-5.000f,-0.000f,+0.000f,
-0.000f,-5.373f,+0.998f,-4.865f,-4.865f,+0.951f,-4.970f,-2.370f,+1.160f,-5.000f,-1.326f,+0.000f,
-0.000f,-4.989f,+1.075f,-2.370f,-4.970f,+1.160f,-3.700f,-3.700f,+0.179f,-4.473f,-2.598f,+0.000f,
-0.000f,-5.000f,+0.000f,-1.326f,-5.000f,+0.000f,-2.598f,-4.473f,+0.000f,-3.536f,-3.536f,+0.000f,

217:215の出力結果(2/2)
07/05/14 21:27:16
+0.000f,+5.000f,-0.000f,+1.326f,+5.000f,-0.000f,+2.598f,+4.473f,-0.000f,+3.536f,+3.536f,-0.000f,
+0.000f,+4.989f,-1.075f,+2.370f,+4.970f,-1.160f,+3.700f,+3.700f,-0.179f,+4.473f,+2.598f,-0.000f,
+0.000f,+5.373f,-0.998f,+4.865f,+4.865f,-0.951f,+4.970f,+2.370f,-1.160f,+5.000f,+1.326f,-0.000f,
+0.000f,+0.000f,-1.000f,+5.373f,+0.000f,-0.998f,+4.989f,+0.000f,-1.075f,+5.000f,+0.000f,-0.000f,
-0.000f,+0.000f,-1.000f,-5.373f,+0.000f,-0.998f,-4.989f,+0.000f,-1.075f,-5.000f,+0.000f,-0.000f,
-0.000f,+5.373f,-0.998f,-4.865f,+4.865f,-0.951f,-4.970f,+2.370f,-1.160f,-5.000f,+1.326f,-0.000f,
-0.000f,+4.989f,-1.075f,-2.370f,+4.970f,-1.160f,-3.700f,+3.700f,-0.179f,-4.473f,+2.598f,-0.000f,
-0.000f,+5.000f,-0.000f,-1.326f,+5.000f,-0.000f,-2.598f,+4.473f,-0.000f,-3.536f,+3.536f,-0.000f,
+0.000f,-0.000f,-1.000f,+5.373f,-0.000f,-0.998f,+4.989f,-0.000f,-1.075f,+5.000f,-0.000f,-0.000f,
+0.000f,-5.373f,-0.998f,+4.865f,-4.865f,-0.951f,+4.970f,-2.370f,-1.160f,+5.000f,-1.326f,-0.000f,
+0.000f,-4.989f,-1.075f,+2.370f,-4.970f,-1.160f,+3.700f,-3.700f,-0.179f,+4.473f,-2.598f,-0.000f,
+0.000f,-5.000f,-0.000f,+1.326f,-5.000f,-0.000f,+2.598f,-4.473f,-0.000f,+3.536f,-3.536f,-0.000f,
-0.000f,-5.000f,-0.000f,-1.326f,-5.000f,-0.000f,-2.598f,-4.473f,-0.000f,-3.536f,-3.536f,-0.000f,
-0.000f,-4.989f,-1.075f,-2.370f,-4.970f,-1.160f,-3.700f,-3.700f,-0.179f,-4.473f,-2.598f,-0.000f,
-0.000f,-5.373f,-0.998f,-4.865f,-4.865f,-0.951f,-4.970f,-2.370f,-1.160f,-5.000f,-1.326f,-0.000f,
-0.000f,-0.000f,-1.000f,-5.373f,-0.000f,-0.998f,-4.989f,-0.000f,-1.075f,-5.000f,-0.000f,-0.000f,

218:デフォルトの名無しさん
07/05/14 21:53:43
誰かエスパーしてくれ

219:デフォルトの名無しさん
07/05/14 23:11:47
新手の荒らしだろ、スルーよろ。

220:デフォルトの名無しさん
07/05/15 00:22:46
k = (((i>>>2)^(i>>>1)^i)&1)*12;

k = ((i>>>2)&4)*12;
と等価じゃない?

221:デフォルトの名無しさん
07/05/15 00:24:00
k = (((i>>>2)^(i>>>1)^i)&1)*12;

k = ((i>>>2)&1)*12;
と等価


222:デフォルトの名無しさん
07/05/15 00:25:45
おいおい、不等号3つって……

223:デフォルトの名無しさん
07/05/15 00:56:43
System.out.printfって何だよ
オブジェクト指向すげえよ

224:デフォルトの名無しさん
07/05/15 02:01:14
>>>220-221
^は排他的論理和、>>>は符号無し右シフト、&は論理積なので、
k=(((i>>>2)^(i>>>1)^i)&1)*12はi=1,2,4,7の時にk=12、i=0,3,5,6の時にk=0となる。
全然等価じゃねーぞ。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5373日前に更新/206 KB
担当:undef