ビット演算

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
厨房くさいトリッキーな高速化テクニックを集めてみませんか?
2デフォルトの名無しさん:2005/08/13(土) 16:29:01
format >>1
3デフォルトの名無しさん:2005/08/13(土) 16:33:44
例えば、
下位5ビットを0埋めする場合。

a = ( a >> 5 ) << 5;
a &= ~(( 1 << 5 ) - 1);
4デフォルトの名無しさん:2005/08/13(土) 16:39:53
0-n を繰り返す。
nは2のべき乗-1

++a &= n;
5デフォルトの名無しさん:2005/08/13(土) 16:40:04
Hacker's Delight
ttp://www.hackersdelight.org/

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか
ttp://www.amazon.co.jp/exec/obidos/ASIN/4434046683
6デフォルトの名無しさん:2005/08/13(土) 16:41:06
0と1を繰り返す。
a = 0;

a ^= 1;
7デフォルトの名無しさん:2005/08/13(土) 17:30:24
一番下位の1になってるbitだけを取り出す

flag = bitmap & ((~bitmap)+1)

bitmap = 0xfffff000 の時 flag は 0x1000 になる。
8デフォルトの名無しさん:2005/08/13(土) 17:40:44
>>7
それは厨房くさくないのでスレ違い
9デフォルトの名無しさん:2005/08/13(土) 18:36:52
x<<n == (2^n)x
10デフォルトの名無しさん:2005/08/13(土) 23:46:59
例えば、
下位5ビットを0埋めする場合。

a = ( a >> 5 ) << 5;
a &= ~(( 1 << 5 ) - 1);
11デフォルトの名無しさん:2005/08/14(日) 02:57:28
int max(int a, int b) {
int m = (a - b) >> 31;
return ((a ^ b) & m) ^ a;
}
あってるかな??
12デフォルトの名無しさん:2005/08/14(日) 09:07:16
"Hello,World!\n"を書くつもりで、あなたの一番好きな
言語でCRC16を書いてください。
13デフォルトの名無しさん:2005/08/14(日) 22:26:51
std::cout << "CRC16";
14デフォルトの名無しさん:2005/08/15(月) 15:28:43
>>13
おまえ、馬鹿じゃねぇの?
俺が正しい見本を書いてやる!

std::cout << "CRC16" << std::endl;
15デフォルトの名無しさん:2005/08/16(火) 15:06:01
ビット演算マニアになれる書籍を教えてください。
16デフォルトの名無しさん:2005/08/16(火) 15:44:09
それは欲しいなw

しかしベッチ演算の面白さは自分で考えることにある。
面白いテクニックを発見した時は射精に至ることも多々。
17・∀・)っ-●◎○- ◆Pu/ODYSSEY :2005/08/17(水) 00:50:17
>>15
読んだ中ではHacker's Delight(邦訳:ハッカーのたのしみ)以上の本は無い
18デフォルトの名無しさん:2005/08/17(水) 17:57:04
>>17
ありがとうございました。
つ -●◎○-
19デフォルトの名無しさん:2005/08/17(水) 18:56:28
xorによる値の交換

int a = 123, b = 234;
a ^= b; b ^= a; a ^= b;
printf("a = %d, b = %d\n", a, b);
20デフォルトの名無しさん:2005/08/17(水) 19:00:49
#define ROUNDUP(x,u) (((x) + (u) - 1) & ~((u) - 1))
xをuの単位に切り上げる。
uは2のべき乗でなければならない。
21デフォルトの名無しさん:2005/08/17(水) 19:54:42
>>19
それは普通のスワップより高速ですか?
22デフォルトの名無しさん:2005/08/17(水) 20:01:53
>>21
メモリの使用量で有位かな?
23デフォルトの名無しさん:2005/08/17(水) 20:19:40
速さはそうでもないという事ですか。
カリカリチューニング用コードですか。
24デフォルトの名無しさん:2005/08/17(水) 20:23:26
テンポラリ変数を宣言する手間が省ける。
25デフォルトの名無しさん:2005/08/17(水) 21:04:19
では速度でも省メモリでも優位という事でよろしいですか?
26・∀・)っ-●◎○- ◆Pu/ODYSSEY :2005/08/17(水) 21:48:26
>>21 演算の並列化ができないから遅い。
>>22 レジスタ使えよ
>>23 むしろ劣化
>>24 STLのstd::swapでも使って露
>>25 だから遅いってばよorz
27デフォルトの名無しさん:2005/08/17(水) 23:25:40
>>26
Hacker's Delight読め。
28・∀・)っ-●◎○- ◆Pu/ODYSSEY :2005/08/17(水) 23:42:02
>>27

a ^= b; ・・・(1)
b ^= a; ・・・(2)
a ^= b; ・・・(3)

(2)は(1)の演算が終わるまで、(3)は(2)が終わるまで実行できない。だから3クロックかかる。
これがいわゆる依存関係ってやつで、モダンなCPUアーキテクチャでは好まれない。

t = a;  ・・・(1)´
a = b; ・・・(2)´
b = t; ・・・(3)´

これなら、ALUが2個以上有る場合、(1)と(2)、もしくは(2)と(3)を並列実行できるから2クロックほどで済む。

もっとも1インストラクション1クロックという前提の話だけど。
29・∀・)っ-●◎○- ◆Pu/ODYSSEY :2005/08/17(水) 23:47:39
おっと、下のはただの代入演算だからALUは使わないや
30デフォルトの名無しさん:2005/08/18(木) 01:34:05
Modern CPU kills the bit calculation.
31デフォルトの名無しさん:2005/08/18(木) 12:46:18
ビット演算に関係する数学ってどんなの?ブール代数以外で。
32デフォルトの名無しさん:2005/08/18(木) 13:53:59
ζ関数
33デフォルトの名無しさん:2005/08/18(木) 14:18:52
>>32
ζ関数をCで書いてみてください
34デフォルトの名無しさん:2005/08/18(木) 20:56:49
#include <stdio.h>
int main(void) { printf("ζ関数\n"); return 0; }
35デフォルトの名無しさん:2005/08/18(木) 21:59:38
いつからだろう?↑こういう発想が出来なくなったのは。
36デフォルトの名無しさん:2005/08/19(金) 21:43:42
一時変数宣言して変数値交換しても
最適化でレジスタに割り振られるから
ビット演算よりも高速ってこと?

最近のCPU(i586以降)だと無意味どころか
有害なビット演算って>>28以外にどういうのがあるの?
37デフォルトの名無しさん:2005/08/19(金) 22:57:03
>>36
例えば乗算の代わりにビットシフトを使うと、CPUによっては却って遅くなる。
38デフォルトの名無しさん:2005/08/20(土) 01:53:34
>>37
ということは、nビットシフトを2**n乗算に置き替えるのがモダンなビット演算だね
39デフォルトの名無しさん:2005/08/20(土) 02:09:12
シフトより乗算が高速。どんなCPUなんだそれは。
40デフォルトの名無しさん:2005/08/20(土) 03:23:51
5回シフトするよりも1回の乗算ってこと?
41デフォルトの名無しさん:2005/08/20(土) 03:26:26
シフトする回数増えるとその分遅くなるもんなの?
誰か教えて。お願い。
42デフォルトの名無しさん:2005/08/20(土) 08:09:13
そういうプロセッサもあった。
例えばx86系ならば、8086-80286までは多ビットシフトの演算器を持っておらず
1bitシフトを繰り返していたため、時間がかかった。

80386以降は、バレルシフタというもの(結構面積を取るらしい)が組み込まれたので
何ビットシフトしようと、同一クロックで処理できるようになった。
ただし、32bit以上のシフトはマスクされるようになった。

と、どっかの本に載ってた。
43デフォルトの名無しさん:2005/08/20(土) 10:50:17
>>42
そんなCPUで積算が高速に実行できるとでも?
44デフォルトの名無しさん:2005/08/20(土) 12:33:50
>>43
んなもんCPUの実装による
45デフォルトの名無しさん:2005/08/20(土) 15:08:27
>>44
そうだけど、脳内CPUじゃなくてさー、実例を挙げてくれよー
46デフォルトの名無しさん:2005/08/20(土) 16:11:07
実例を挙げられないのはお互い様
47デフォルトの名無しさん:2005/08/20(土) 16:21:00
16bit整数の乗算は8086 (8 MHz)で約15 us、80286 (6 MHz)で3.5 usだそうだが?
48デフォルトの名無しさん:2005/08/20(土) 16:28:04
というわけで実例よろ
なんだかんだ言い逃れして絶対に挙げないのは分かってるけど
49デフォルトの名無しさん:2005/08/20(土) 16:35:32
馬鹿?
50デフォルトの名無しさん:2005/08/20(土) 17:04:01
ほらね
51デフォルトの名無しさん:2005/08/20(土) 17:28:48
       ☆ チン

 ☆ チン  〃 ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄
  ヽ ___\(\・∀・)< 実例マダー?
      \_/⊂ ⊂_)_ \______
    / ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
   |  ̄  ̄ ̄ ̄ ̄ ̄ ̄:|  |
   | Intelはいってる .|/
    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
52デフォルトの名無しさん:2005/08/20(土) 22:07:25
>>43は明日中に実例出すように。

じゃなきゃトンズラと見なしますんで。
53デフォルトの名無しさん:2005/08/20(土) 23:12:31
>>52
勝手にどうぞ。
独りで高らかに笑っててください。捕まらん程度に。
54デフォルトの名無しさん:2005/08/21(日) 00:04:12
捨て台詞に水を差すようで悪いが悪いが笑うのは少なくとも二人だぞ?
55デフォルトの名無しさん:2005/08/21(日) 00:59:12
少なくとも三人。一人なのはむしろそっちだということにも気付いてないのか
哀れな
56デフォルトの名無しさん:2005/08/21(日) 11:48:16
先に実例とか言い出すほうが実は何の根拠も無くレス書いてる
(何か言いたげなのに何故か他人に書かせることばかり必死なのはそのせい)
というのはもうお約束だな。
57デフォルトの名無しさん:2005/08/21(日) 11:51:50
>37
>例えば乗算の代わりにビットシフトを使うと、CPUによっては却って遅くなる。
で、こういうCPUは存在するのか?
58デフォルトの名無しさん:2005/08/21(日) 13:12:54
ビットシフトが複数回に分割されるCPUなんて今時ないからなぁ。
じゃあ昔はどうだったかって考えても、高速乗算回路じゃBoothのアルゴリズムを
使ってたんだから乗算するのにそもそもシフト使ってるわけで。
最近の乗算はどうやってるんだろうな。Boothはもう使ってないのか?
59デフォルトの名無しさん:2005/08/21(日) 13:59:25
「?」ばっかだな。
実例を出さない代わりにねちっこい質問を延々相手にぶつけ続けて、
相手が自分を放置し次第、一度も実例を出さないまま「相手は逃げた。やっぱり俺は正しい」と
勝利宣言する作戦か。
60デフォルトの名無しさん:2005/08/21(日) 14:11:18
>>58
ビットシフトが1ビットシフト命令しかない8086という16ビットCPUならまだ現役ですが何か?
61デフォルトの名無しさん:2005/08/21(日) 14:17:06
>>59
させてやりな。それで彼に英知が身に付くわけでなし。
62デフォルトの名無しさん:2005/08/21(日) 18:19:25
16倍するときに4ビットシフトするより
addを4回続けた方が早いCPUならまだ存在する。
63デフォルトの名無しさん:2005/08/21(日) 21:29:02
leaの方が速そうな希ガス。
64デフォルトの名無しさん:2005/08/23(火) 03:24:04
俺が待ち望んでいたスレはここですか?
65デフォルトの名無しさん:2005/08/23(火) 08:39:00
ちがいます
66デフォルトの名無しさん:2005/08/23(火) 16:44:39
年月日から曜日を出すトリッキーなやつなかったっけ?
ビット演算じゃなかったかも。
67デフォルトの名無しさん:2005/08/23(火) 17:03:28
>>66
Zellerの公式のことかな?たしかにこれはビット演算ではないわけだが。
http://www.kumei.ne.jp/c_lang/intro/no_41.htm
68デフォルトの名無しさん:2005/08/23(火) 23:41:48
x2 = (x1 * sin[dg]) - (y1 * cos[dg]);
y2 = (x1 * cos[dg]) - (y1 * sin[dg]);

な点の回転を掛け算使わずにシフトでやるとか見たような気がする。

69デフォルトの名無しさん:2005/08/24(水) 10:56:57
70デフォルトの名無しさん:2005/08/24(水) 11:20:37
>>68
そもそも回転になってない式持ち出されても。
回転なら、
x2 = x1 * cos(dg) - y1 * sin(dg)
y2 = x1 * sin(dg) + y1 * cos(dg)
だと思うのだが。

で、要は三角関数をテーブル参照して、乗算をシフトでやるってこと?
精度が出そうにないし、8or16ビットCPU時代のゲームの話かな?
71デフォルトの名無しさん:2005/08/26(金) 01:08:47
>>70
人をバカにするだけの人生に何の意味があるのか。
72デフォルトの名無しさん:2005/08/26(金) 01:24:30
>>71
>70は馬鹿にしてないと思うのだが。それとも、あなたは被害妄想爆発の>68ですか?
73デフォルトの名無しさん:2005/08/26(金) 01:54:03
>>68ではない気がする。
ただ誰かを叩きたくてうずうずしてるパーポリンだろ( ´_ゝ`)
74デフォルトの名無しさん:2005/08/26(金) 21:57:31
>>72
思うのは自由ですが、あまり自分の鈍くさい判断力を
他人に当てはめない方がいいですよ。
7570:2005/08/26(金) 22:21:42
少なくとも>72の方が>74よりはましだったようだ。
76デフォルトの名無しさん:2005/08/26(金) 22:53:15
>>74
(´・ω・`)カワイソス
77デフォルトの名無しさん:2005/08/26(金) 23:36:42
ひどい自作自演を見た気がする
78デフォルトの名無しさん:2005/08/27(土) 03:04:35
>>11はif文を使うより高速ですか?
79デフォルトの名無しさん:2005/08/27(土) 05:23:49
>>78
わかんね
今はif文の方が速いと思う
勘だけどな
80デフォルトの名無しさん:2005/08/27(土) 07:33:01
>>78
ステップ数がどの条件でも同一という利点以外はないよ。
81デフォルトの名無しさん:2005/08/27(土) 07:35:00
>>80
分岐が無いから、命令キャッシュが無駄にならない。
82デフォルトの名無しさん:2005/08/27(土) 08:57:33
それだったらinline展開しないと勿体無いな。
83デフォルトの名無しさん:2005/08/27(土) 10:37:36
>>57
実在するよ。
初期のSHは1,2,8とかの決まったシフト数しか左シフト出来なかったんで
シフトを組み合わせないといけなかったから。

DSP系だと、掛算は専用掛算器を持っているし
シフタもバレルシフタを持っているのだけど、
命令長の関係からシフトするのにレジスタをあちこち移動しなくちゃいけなくて
掛算した方が早いという場合がたまに出てくる。
84デフォルトの名無しさん:2005/08/27(土) 10:52:21
>>78
書いて試してみればいいじゃない。
でも、Cだとコンパイラによるかもね。
(a - b) >> 31 をSUB+CWD命令に置き換えてくれるくらい賢いならいいんだけど
85デフォルトの名無しさん:2005/08/27(土) 15:02:03
>>83
初期のSHってどこまで?
86デフォルトの名無しさん:2005/08/27(土) 16:24:43
>>85
そんぐらい自分で調べろヴォケ屑!
87デフォルトの名無しさん:2005/08/27(土) 16:59:03
>83
1,2シフトはわかるとしても、8シフトの中身は本当にシフト命令になってるんだろうか・・・?
88デフォルトの名無しさん:2005/08/27(土) 17:17:13
淫乱展開
89デフォルトの名無しさん:2005/08/29(月) 17:47:34
ウソクサイ
90デフォルトの名無しさん:2005/08/30(火) 07:43:01
>>87
1,2,8,16のシフトはそれぞれ1サイクル命令
16x16の掛算も1サイクル命令(ただし結果を利用出来るのはさらに2サイクル後)
91デフォルトの名無しさん:2005/09/04(日) 13:19:12
何の前置きもなくいきなりIA32の話をされてもむぅんって感じ。
92デフォルトの名無しさん:2005/09/05(月) 07:37:15
いきなりIA32って・・・・このページの事?

ttp://www.tensyo.com/urame/prog/ALGO.HTM
より
/************************************************************
符号無し同士の加算をし、結果がオーバフローしたら最大値にする
unsigned ClipAddUU(unsigned a,unsigned b)
{ unsigned c=a+b;
if(c>=a && c>=b) return c;
return (unsigned)-1;
}
************************************************************/
unsigned ClipAddUU(unsigned a,unsigned b)
{
unsigned c;
_asm {
mov eax,a ;
add eax,b ;
xor ecx,ecx;
sbb ecx,0 ;
or eax,ecx ;
mov c,eax; /*帰値はeaxなので不要だが警告を黙らせる為*/
};
return c;
}
93デフォルトの名無しさん:2005/09/05(月) 09:06:28
nakedを知らんのか
94デフォルトの名無しさん:2005/09/05(月) 09:39:46
naked(・∀・)イイ
95デフォルトの名無しさん:2005/09/05(月) 09:52:35
このスレらしく無駄にビット演算使ってみるとこんな感じか。

unsigned ClipAddUU(unsigned a,unsigned b)
{
    unsigned c=a+b;
    return c|-(c<(a|b));
}
96デフォルトの名無しさん:2005/09/05(月) 10:04:54
>>93 2000年って事だから __declspecそのものが無かったような・・・・
97デフォルトの名無しさん:2005/09/05(月) 10:20:29
このスレはトリッキースレと被ってるけど、まあいいか。
為になりそうでならないところがいい。
98デフォルトの名無しさん:2005/09/05(月) 11:08:33
>>96
そんなこたない
99デフォルトの名無しさん:2005/09/05(月) 13:09:34
アセンブラで書くなら、JCの方がコードは短いだろ
100100:2005/09/06(火) 01:14:50
 
101・∀・)っ-●◎○- ◆Pu/ODYSSEY :2005/09/08(木) 08:14:36
>>62
Pentium4のことかぁぁぁ

あれは上下16ビットに分かれててタイミングずらして演算するからね。
単純なビット論理や加減算なら1命令0.5クロックだけどシフトは4クロック
だったような。Prescottはよく知らないけど。
102デフォルトの名無しさん:2005/09/09(金) 22:05:32
ビット演算は不毛なんでしょうか
103・∀・)っ-●◎○- ◆Pu/ODYSSEY :2005/09/09(金) 22:23:14
http://www.darkside.com.au/bitslice/nonstd.c

のs2関数をAltiVecの AND / AND-NOT / OR / NOR / XOR で構成し直して
50ゲート以内に納めたら神認定。
104名無しさん@そうだ選挙に行こう:2005/09/11(日) 17:01:21
「ハッカーのたのしみ」以外にビット演算について詳しく書かれた本はありますか?
105・∀・)っ-●◎○- ◆Pu/ODYSSEY :2005/09/11(日) 17:35:01
俺が持ってる本でビット演算について触れてるのは
やねうらおの「Windowsプロフェッショナルゲームプログラミング」
って本かな。
MMXを使わずにアンパック演算やサチュエーションとか
整数ALU/レジスタで小数として使う方法とか載ってるけど
ゲームに関わらずWindowsでC/C++な人は読んでみると良いかも。

あと、Hacker's Delight公式サイトにそれなりの有用なリンクがあるよん。

この本の日本語版が出たのって某東大生のページで取り上げられてから
1年くらい後だったな。
106名無しさん@そうだ選挙に行こう:2005/09/11(日) 17:39:39
>>105
ビット演算に触れてるのは、「Windowsプロフェッショナルゲームプログラミング2」のほう
107104:2005/09/11(日) 18:49:36
>>105-106
レスありがとうございます。

108デフォルトの名無しさん:2005/09/28(水) 12:17:36
もう終わりか…
109デフォルトの名無しさん:2005/10/08(土) 07:10:37
終わっちゃうなんていやいや><
110デフォルトの名無しさん:2005/10/28(金) 22:31:00


【拷問ビデオ】恋人がAVに出演してた【許すな!これはAVじゃない】
http://ex10.2ch.net/test/read.cgi/news4vip/1130499649/

111デフォルトの名無しさん:2005/10/31(月) 21:18:17
Pentium4では、シフト命令よりadd命令が早いそうだ
何と、シフト1命令とadd8命令が同じ速さ
http://www.marumo.ne.jp/db2002_7.htm#25
112デフォルトの名無しさん:2005/11/01(火) 19:44:27
「何と」っつー程の話じゃないな。
113デフォルトの名無しさん:2005/11/02(水) 18:16:30
内部で同じμopに変換されてるってだけの話じゃないの
114デフォルトの名無しさん:2005/11/03(木) 01:58:38
>>111
それなりに有名かもしれないけど128倍までならadd %eax, %eaxの方が速いってことだよね。
「変態」なだけで自慢できることじゃないけど。プレスコだとこれまで0.5サイクルだったのが
1サイクルになってしまったのであまり意味内。
115デフォルトの名無しさん:2005/11/03(木) 04:10:34
むしろシフトが4クロックもかかるのが異常。
左シフトはそれでいいかもしれないけど右シフトはやっぱり4クロックかかるわけで。

やっぱPentium Mのほうが立派だわな。
116デフォルトの名無しさん:2005/11/03(木) 16:26:26
シフトは足し算より掛け算にした方が早い
117デフォルトの名無しさん:2005/11/04(金) 15:55:05
>>116
多ビットシフトで掛け算が一番速いのってプレスコか?
いや、さすがにレイテンシ4のシフトのが速いだろ。
118デフォルトの名無しさん:2005/11/04(金) 18:12:16
そんなのはベタなネタだって。
乗算がシフトより早いなんてありえないじゃん。
IMUL  レイテンシ 14    スループット 3
MUL  レイテンシ 14-18  スループット 5
119デフォルトの名無しさん:2005/11/04(金) 18:23:36
バレルシフタがないCPUならありえるかもね。SH1とか?
120デフォルトの名無しさん:2005/11/04(金) 18:39:29
>>119
ガイシュツ
121デフォルトの名無しさん:2005/11/04(金) 22:17:41
>>119
SH1/2/DSPマニュアルでは、
 シフト命令 1ステート
 乗算     1(2)〜3(4)ステート
ってあり、これはSH1でも変わらない。
DSPからバレルシフタは載ってるけど。
122デフォルトの名無しさん:2005/11/04(金) 22:23:35
>>121
ということは4bit以上シフトするなら乗算の方がいいのか
123デフォルトの名無しさん:2005/11/04(金) 22:46:53
>>122
ちがうって。
1、2、8から4つ以上を重複組合せで取って合計しないと表せない数で
シフトを行う時は乗算が絶対速い。
逆に3つ以内だとシフトのほうが早い可能性がある。
具体的に挙げていくと
・1つで済む
  1、2、8
・2つで済む
  3、4、6、7、9、10、16
・3つで済む
  5、11、12、14、15、17、18、24
てな感じでSH1/2の実用的な範囲では13以外は表せる。
124デフォルトの名無しさん:2005/11/04(金) 23:15:12
それは、乗算の代わりにシフトで実現する場合の話だね。
今問題にしてるのは、
シフトの代わりに乗算を使った方が早いっていうCPUがあるのか?
だと思ってたけど。
125デフォルトの名無しさん:2005/11/04(金) 23:58:07
シフト数が変数だったらどうするのかな。
やはりシフト用実行時ルーチンを読んで、中で分岐か。
13とか19は掛け算になってるのかな。
126121:2005/11/05(土) 00:25:34
>>122
いやーその通り。
SH-1のシフト・ローテイト命令は
1bitシフト
8bitシフト
16bitシフト
しか無い。
127デフォルトの名無しさん:2005/11/05(土) 01:34:13
x86系は定数の掛け算ならLEAのが速いような。
アドレス生成ユニット使うから、ALUで実行する別の命令と並列化できる。
128デフォルトの名無しさん:2005/11/05(土) 20:37:41
あるバッファを高速にゼロクリアして、さらにゼロになっているかかくにんするプログラムを作りたい
けど、とにかく高速に処理をしたいと思っています。
何か良い方法はありますか?

使っているのはSH-2の7145です。

とりあえず、RAMに0を代入して、その領域と任意の変数(初期値0)とORしていき、次のRAMをクリア。
最終的にその任意の変数が0になっているかを確認という方法をとっています。
129デフォルトの名無しさん:2005/11/05(土) 20:59:44
何で代入しているのに確認しないといけないのかよくわからんなぁ。

ゼロクリアって言ったら昔こんなのなかったっけ?

xor eax, eax

たしか
mov eax, 0
より高速だとか聞いたけど。
SH1でどうかは知らん。
130デフォルトの名無しさん:2005/11/05(土) 21:38:44
>>128
よく状況がわからんけど、
もしメモリマップドI/Oのレジスタ操作なら、ターゲットのI/Oの仕様を確認して
必要なウェイト数だけ待たなければならない。
そうでなく単なるRAMなら0になった確認など要らないと思う。
131デフォルトの名無しさん:2005/11/05(土) 22:46:11
>>129-130
ネタに釣られないように。
制御系関連のスレで同じ質問見たことある。
132デフォルトの名無しさん:2005/11/05(土) 23:22:31
>何で代入しているのに確認しないといけないのかよくわからんなぁ。

ようは、きちんと任意のRAMがクリアされているかの確認です。
仕様上、確認するようにとのことです。

もう少し、他に例を挙げるなら、電源投入時にRAMのチェックってやりますよね?
(0xAAAAAAAAや0x55555555など書き込んでチェック)
あれを速くする方法などありますか?
133デフォルトの名無しさん:2005/11/06(日) 00:23:16
メモリテストなら、0を書き込むのはあまり意味が無い。
なぜ、Aと5を書き込むのかよく考えれ。
134ちょっとからかってみるか…。:2005/11/06(日) 00:53:38
0x00 より 0xAA や 0x55 の方が良い理由を述べてください。
135デフォルトの名無しさん:2005/11/06(日) 00:58:18
>>134
RAMが壊れてても、0xFFか0x00返すからな。
136デフォルトの名無しさん:2005/11/06(日) 01:02:36
もっと言うと、アドレスの下位ビットが同じ場所には別のアドレスの情報が転写されてる場合(アドレス線のショート)もあるから、2の倍数じゃない単位で書き込む内容を変化させるといいよ。
そうそう、データ線のショートのチェックもしたいなら、1ビットづつシフトさせて書き込みチェックな。
137デフォルトの名無しさん:2005/11/06(日) 01:22:46
アドレッシングも何パターンか変えて試行しろ。
138デフォルトの名無しさん:2005/11/06(日) 01:32:04
>>135
まあ、データバッファとかが壊れたらそうだろうけど、メモリセルの一ビット
故障だと 0x55/0xAA が特に優れてるわけじゃないよね。

>>136
> アドレスの下位ビットが同じ場所には別のアドレスの情報が転写されてる場
> 合

落ち着いて、日本語をしゃべれよ。
139デフォルトの名無しさん:2005/11/06(日) 01:36:52
> 落ち着いて、日本語をしゃべれよ。

十分日本語だぜ?
わからねえ奴には何言ってもわからねえらしいな。
140デフォルトの名無しさん:2005/11/06(日) 01:42:55
まあメモリセルのアドレス線配置を調べて(カラム、ロー)、その同じロー、カラム線化けを
逃さないようにアクセスすることも考えるべきかな。

>>136
データ線の影響なら、最下位ビットとその他のビットのエラーになる確率は変わらないと思うよ。
141デフォルトの名無しさん:2005/11/06(日) 01:43:54
>>138
メモリーセルの1ビットの故障を調べるなら、なおさら0x00なんかより、0x55と0xAAを何回か書き込んでみる方がよっぽどマシだぞ。
142デフォルトの名無しさん:2005/11/06(日) 01:48:20
>>138
でもまあ他のパターンよりかは、5とAを交互に行うのが一番効率は良いよね。
俺は、0とFのパターンとか、特定ビットだけが違う(例 E, D, B, 7とその反転)のも行うけど。
143デフォルトの名無しさん:2005/11/06(日) 01:55:19
最近はキャッシュなんてやっかいなものがあるから、
キャッシュあり・なし(ミスヒット)パターンなんてのもやらないと意味がない。
144デフォルトの名無しさん:2005/11/06(日) 02:07:46
>>139
ハイハイ、俺様日本語ね。
おまえがアフォだということだけは、伝わったよ。(w

>>141-142
だから、なぜ 0x55, 0xAA がいいのか理由を書いてよ。
145デフォルトの名無しさん:2005/11/06(日) 02:11:19
>>144
ヒント:2進数表記
146デフォルトの名無しさん:2005/11/06(日) 02:11:42
2進数で考えれ。
それでも判らないのなら、H/Wのお勉強をしろ。
147デフォルトの名無しさん:2005/11/06(日) 02:15:16
>>144
>>138以降のやりとりを見ててだな、
お前以外はみんな言ってる意味が判ってるとは思わんか?
そこに噛み付いてるのはお前だけだろが。
148デフォルトの名無しさん:2005/11/06(日) 02:39:38
>>144
メモリバケの要因は大量にあるので、ほんのさわりだけ。
念のために、俺はソフト屋でありハードウェアのことは門外漢なのであしからず。


隣接線上の影響とかではなく、純粋にメモリセルビットの故障なら、
0を書き込んでも1を書き込んでも、どっちでも0になるとか、
また逆に、
0を書き込んでも1を書き込んでも、どっちでも1になるとかいうことが考えられる。
この場合だけなら、0とFを交互に書き込んでも、5とAの場合と効率は同じ。

次に、隣接データ線が影響するような場合、
あるbitにread/writeしたものが、実は別のbitに対するread/writeに引きずられるとかいう場合
0とFでは見逃す可能性が大きくなる。
もちろん5とAでもそれは言えるが。

さらに、隣接データ線により多くの同じデータが流れる場合、
周りのデータに合わせたデータに化ける可能性もある。
この場合、00とかFFではより化けやすく、かつそれを発見できない。
5とAだと、0と1の量が等しいアクセスとなる。
149デフォルトの名無しさん:2005/11/06(日) 02:46:54
ついでにもうひとつ。

アクセス時間が影響する場合も考えられる。
要するに、直前のアクセスのデータが消えずにそれが流れるような場合。
この場合、0x00とか0x55とかを連続してread/writeすると検出できない。
なので0x55と0xAAを交互にアクセスするのが良い。
150デフォルトの名無しさん:2005/11/06(日) 03:49:07
データが保持できないっていうメモリ障害もありえるね。
書き込み後、リフレッシュ保持時間以上の間隔を空けてベリファイする。
151デフォルトの名無しさん:2005/11/06(日) 09:59:06
>>145-146, >>148
あんまりに簡単に釣られすぎ。(w

n bit × 1 のメモリを並べたメモリモジュールなら、各々のメモリーにとっ
て見れば 0x00, 0xFF を書くのと 0x55, 0xAA を書くのは違いはないだろ。

それこそ、>>145-146 が言うように、2進数表記 (ビット単位) で考えれば明
らかだろ。偉そうに H/W のお勉強とか言ってると恥をかくぞ。

で、マルチビットメモリーなら 0x55, 0xAA が有利なのかい?

>>147
アドレス線について語ってるのは、>>140 だけ。
しかも、アドレス線ショートについて一般的なこと言ってるだけ。
まあ、>>136 がなに言ってるかわからんから無視されてもしょうがないわ
な。(w

>>149-150
まあ、そこまで言い出すときりがない。
そもそも、D-RAM はデータ読んだだけでそのデータが消えちゃうんだから、読
み出しだけでも他のセルに影響与えるからね。
152デフォルトの名無しさん:2005/11/06(日) 11:41:49
全然分かってない奴がいるな
153デフォルトの名無しさん:2005/11/06(日) 11:56:24
>>152
話についていけないなら、無理してついてこなくていいんだよ。。(w
154デフォルトの名無しさん:2005/11/06(日) 13:21:55
とりあえず、高速に処理する方法から遠ざかっているよな
155デフォルトの名無しさん:2005/11/06(日) 13:23:37
>メモリテストなら、0を書き込むのはあまり意味が無い。

別にメモリのテストではなく、ある処理をしていて、磁気データやバーコードデータ
をある動きの中でゼロクリア&確認したいだけです。


156デフォルトの名無しさん:2005/11/06(日) 13:58:52
>>151
だからどういうエラーが考えられるのかは、
メモリとかのH/Wを勉強しないと分からないだろ?
157デフォルトの名無しさん:2005/11/06(日) 14:00:41
>>155
マルチスレッドなら、そういう確認は意味がなく、排他制御を考えた方が良いよ。
158デフォルトの名無しさん:2005/11/06(日) 14:04:32
>>151
配線によるエラーって、それこそチップ内部の配線で
特定のメモリセルブロックのみ断線とか混線とかしてる場合とか
コンデンサのチャージエラーとかグランドへの抜け(ショート)とかって話だよね?
159デフォルトの名無しさん:2005/11/06(日) 14:44:07
もはや録音テープと化してるなw
160デフォルトの名無しさん:2005/11/06(日) 16:04:27
>>151
お前、2進数だって説明で納得できるのか?
俺なら、0x00と0xffの場合とどう違うんだ?って思うぞ。
だからこそ、H/Wの勉強が必要なんじゃないのか?
161デフォルトの名無しさん:2005/11/06(日) 22:09:25
H/W の勉強って言ってる奴は、馬鹿じゃないのか?
いったいどの分野を指してるんだ?
162デフォルトの名無しさん:2005/11/08(火) 23:47:07
>>159
それは録音様がこのスレにも降臨なされたという意味ですか?
163デフォルトの名無しさん:2005/11/09(水) 09:16:09
うん
164デフォルトの名無しさん:2005/11/16(水) 08:57:48
>>161
遅レスだが、H/W診断プログラムを作成するのに
対象のH/Wを熟知してなきゃダメだろって思うんだが。
165デフォルトの名無しさん:2005/11/17(木) 06:00:16
知らない奴に使わせて無茶苦茶しても壊れない・・・ってのは製品ではいいがナマハードではだめか
166デフォルトの名無しさん:2005/11/18(金) 00:10:21
>>165
このポート、リード専用で、書くと物理的に壊れますから。とかなら経験あるなぁ。
167デフォルトの名無しさん:2005/11/20(日) 02:50:53
ああ、そういうの俺も経験ある
というか、outbにラッパー入っててあるポートへの出力に
アサート入ってた
168デフォルトの名無しさん:2005/11/29(火) 13:52:20
x++;
x=-!x;
ってどっちが速いの?><
169デフォルトの名無しさん:2005/11/29(火) 14:56:32
>>168
>x=-!x;
嫌がらせとしか思えない。
170デフォルトの名無しさん:2005/11/29(火) 16:23:31
>>168
!じゃなくて~だろ。
x = -~x; と x++; をgccで試したら同じアセンブラ吐いたので、答えは同じ。
171デフォルトの名無しさん:2005/11/29(火) 21:18:03
>>168
勿論x++;の方が速くタイプできるに決まっておろう。
172デフォルトの名無しさん:2005/11/29(火) 22:49:35
てか、x++; じゃなくて ++x; を使うように習慣付けとけ。
173デフォルトの名無しさん:2005/11/29(火) 23:41:18
>>172
なんで?
174171≠172:2005/11/29(火) 23:43:07
C++では前置と後置では意味が違ってくるから、C++を睨んで前置の習慣をつけるべき。
#だとは思うが、このスレでは別に指摘するほどのことじゃないと思う。
175デフォルトの名無しさん:2005/11/30(水) 00:02:59
Cで++xよりx++が好まれるのは、x += 2とした場合と左右の位置が変わらないから
・・・な気がする
176デフォルトの名無しさん:2005/11/30(水) 00:36:12
コンパイラやコンパイルオプションで変わる
177デフォルトの名無しさん:2005/11/30(水) 07:04:07
ハッカーの楽しみ買いました。
毎日オナニーしています。
178デフォルトの名無しさん:2005/11/30(水) 07:24:43
dst++ = src++;

こう書きたいからなぁ
179デフォルトの名無しさん:2005/11/30(水) 08:00:28
180デフォルトの名無しさん:2005/11/30(水) 08:22:22
bcc32では
x++;の方が速かったです。

inc

not
neg
の違いでした。(-O2)
181デフォルトの名無しさん:2005/11/30(水) 15:36:53
ビット演算を用いることによりブランチフリーにする意義は?
182デフォルトの名無しさん:2005/11/30(水) 16:39:58
ストール避け
183デフォルトの名無しさん:2005/12/04(日) 16:20:12
ストールってなんですか?
わかりません><
184デフォルトの名無しさん:2005/12/04(日) 16:38:41
>>183
寒い時に使う奴だよ。
185・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/04(日) 16:44:30
CPUは1つの命令を実行するのに何段階かの行程を経る必要があるのです。

モダンなCPUには丁度ベルトコンベアで流れ作業するような感じで、命令の実行までの処理を順番に
流していくための機構が備えられています。これをパイプラインという
これにより、見た目上、1つのパイプラインで1命令1クロックで命令が実行されることになります。

ただ、すぐ次の命令の流れが前の命令の実行結果に依存してる場合、

・投機実行を備えてないプロセッサの場合、分岐先が確定するまで
 何を流せばわかりません。したがって、それだけ待たされることになります。

・分岐予測&投機実行なんかが導入されてる場合(大抵のx86アーキはそう)でも、
 予測が外れた場合、投機してたステージを全部破棄して再度読み直すことになります。

10ステージのパイプラインなら10クロック+αは、分岐(or投機失敗)のたびに、
命令実行が止まることになります。これがストール。
186デフォルトの名無しさん:2005/12/04(日) 17:01:08
あーつまり エンスト は エンジンストール の略だ。
187・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/04(日) 17:09:06
つまりストールマンは思考停止した人ってことくぁwせdrftgyふじこlp;「’」
188デフォルトの名無しさん:2005/12/04(日) 19:35:52
レジスタの値を0にするときなぜ以下のように書くのでしょうか?
xor eax, eax
189デフォルトの名無しさん:2005/12/04(日) 19:57:05
速いから
190・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/04(日) 20:03:36
C言語で書くとこれと等価なんだけど
a ^= a;

XOR演算の定義は

入力1 入力2 出力
  0   0   0
  0   1   1
  1   0   1
  1   1   0

だから、同じ値でビット排他論理和を取ると、レジスタの値によらず必ずゼロになる。
これは大概の実装ではレジスタに0をロードするより速い。
191188:2005/12/04(日) 20:05:42
>>190
詳しい説明ありがとうございました。
192デフォルトの名無しさん:2005/12/05(月) 02:57:33
>>185
わかりました><

ストールによるデメリットと、投機実行的中のメリットで期待値はトントンにはならないんですか?

ブランチフリーのが正しい姿勢なのですか?
193デフォルトの名無しさん:2005/12/05(月) 03:06:54
こんな質問をするなんてよく分かってない証拠ですね><

よくよく考えると今の質問はナンセンスでした。
ようするにブランチフリーにすると
パイプライン達を相対的に酷使し続けられるってことですね><
194デフォルトの名無しさん:2005/12/05(月) 03:09:29
それから、おだんごいただきます。><
っ-●○◎-
195デフォルトの名無しさん:2005/12/05(月) 04:30:18
最近はXORで初期化するよりイミディエイトで0入れた方が速いらしいが
196デフォルトの名無しさん:2005/12/05(月) 07:12:40
CPUによるよね。同じプログラムでもBCCとかはXORだけど
SHC(SHっていう日立製CPUのコンパイラ)だと0をセットしてるね。
197デフォルトの名無しさん:2005/12/05(月) 23:22:52
っ-●-----
余ったのでお返しします><
198 ◆CHINPOGEDU :2005/12/05(月) 23:27:39
>>16
きめぇw
199デフォルトの名無しさん:2005/12/06(火) 00:28:12
>>198
そんなトリップ付けた奴に言われたかないだろうな。
200・∀・)っ-●---- ◆Pu/ODYSSEY :2005/12/06(火) 00:48:37
SHって基本的に命令が全部16ビット固定長のアレか。
201デフォルトの名無しさん:2005/12/06(火) 21:04:57
XORとSUBはreg,regに限れば同じだよね?
202デフォルトの名無しさん:2005/12/06(火) 22:23:53
8080の古より0クリアにはxorと伝承されてきたのです。
#いや、subはフラグに影響を与えるから避けたと言うのが真相だと思うけど。
203デフォルトの名無しさん:2005/12/06(火) 22:50:44
xorもフラグに影響しますが。
じゃなくて、

フラグ(CY)に依存しないsub命令が8080/Z80には無かったから
XOR A でアキュームレータをゼロにするのが一般的だった。

本当に一番最初にXOR Aを見たときは、「こんなとこで何やってんだ」と思ったけどね。
XORの動作を確認して、初めて納得した。
だって、実際にXORを使う場面なんて、数値演算(暗号/画像等)以外では
ゼロクリア以外無いじゃん?
積極的に使ってあげないと。
204デフォルトの名無しさん:2005/12/06(火) 22:59:54
んー、と思って書いてみたものの、ちゃんとZ80にもSUBはあるなあ。記憶違いだ。
205デフォルトの名無しさん:2005/12/06(火) 23:49:06
離散数学って代数と関係あるの?
206デフォルトの名無しさん:2005/12/06(火) 23:59:24
>>203

CRC とか パリティとかで

あ、それ数値演算?

っつーか SUB も AND も数値演算ちゃうんかと
207デフォルトの名無しさん:2005/12/07(水) 09:14:51
論理演算
208デフォルトの名無しさん:2005/12/11(日) 01:01:51
>>203
MSX2のスプライトで脚光をあびたな
209デフォルトの名無しさん:2005/12/12(月) 14:40:43
比較って何命令かかりますか?
x>y
x==y
とか。
210デフォルトの名無しさん:2005/12/12(月) 15:29:26
マシンサイクルのことか?
211デフォルトの名無しさん:2005/12/12(月) 15:45:53
はい。
addとかより時間かかりますよねきっと
212デフォルトの名無しさん:2005/12/12(月) 15:51:37
おなじ
213デフォルトの名無しさん:2005/12/12(月) 15:53:04
えー、うちのマシンだと2時間くらいかかったぉ
214デフォルトの名無しさん:2005/12/12(月) 16:21:49
一概には、ステート数は言えない。
それは、例えばC言語での記述のことだと思うが、
マシン語の対応が、x,yが何であるのかによって
命令数も変わってくるし、例えそれが純粋な比較命令
cmp EAX, [mem]
一つであったとしても実行時間は
すんなり行けば、1サイクル(なおP4だと、1サイクルで最大3命令同時実行できる)
で済むかも知れないが、命令の並びによって余分に掛かることもあるし
最悪ペナルティが発生すると数十サイクル掛かることもある。
215デフォルトの名無しさん:2005/12/12(月) 17:10:11
ありがとうございました。
216デフォルトの名無しさん:2005/12/16(金) 15:17:48
addとorはどちらが速いですか?
217デフォルトの名無しさん:2005/12/16(金) 15:19:19
リファレンス嫁
218デフォルトの名無しさん:2005/12/16(金) 16:38:36
ビット演算とかしたことない素人です。
ある数nを2進数表示して
  n=u[0]+u[1]*2+u[2]*2^2+…
としたときのu[0〜N]を扱いたいんですが
どのようにしていいかわかりません。

もっと具体的に書くとある数aに対して
  a^u[0],(a^u[1])^2,(a^u[2])^4,…
を求めたいのです。

わかりやすく教えていただけるとありがたいです。
よろしくお願いします。

219デフォルトの名無しさん:2005/12/16(金) 17:05:29
for (int i = 0; i < N; ++i, n >>= 1) u[i] = n & 1;
220デフォルトの名無しさん:2005/12/16(金) 17:17:26
リファレンスはどこで閲覧できますか?
221デフォルトの名無しさん:2005/12/16(金) 17:30:02
チップベンダーのサイト
222ハーピィ:2005/12/17(土) 18:44:27
E・∇・ヨノシ <222ゲット♫
223デフォルトの名無しさん:2005/12/18(日) 00:53:38
ちょっと前の話題だが、X86でゼロクリアにXOR使うのは速度面ではなく、
即値使うより命令サイズが小さくなるからじゃなかったっけ?
224デフォルトの名無しさん:2005/12/18(日) 01:00:57
そう。
ただ、何故subじゃなくてxorなの?という話だった気がする。
225・∀・)っ-●---- ◆Pu/ODYSSEY :2005/12/18(日) 01:27:57
論理回路の実験で半加算器・全加算器作ったことある奴ならわかると思うけど
ビット演算は原則的に同じビット同士で演算すればいいけど、算術演算は桁上げがあるから
回路の負担も大きいわけ。
実装によりSUBがXORより遅くなる可能性はあるが逆は原則としてないじゃん。

いずれにせよ、同じレジスタ同士のXOR演算はレジスタリネーミングのヒントを与える効果もあるし
(少なくともここ最近のIntel CPUの実装ではそう)積極的に使うべきである。
226デフォルトの名無しさん:2005/12/18(日) 03:11:54
あと、速度が一緒でもXORのほうが消費電力・発熱が僅かに少ないなんて利点もあるかも。
・・・仮にそうだとしてもホントにどーでもいいレベルの差だろうけどw
227デフォルトの名無しさん:2005/12/18(日) 03:30:20
>>225
同期回路ならまずそれはないな
228・∀・)っ-●---- ◆Pu/ODYSSEY :2005/12/18(日) 03:50:18
ヒント:Pentium 4のレイテンシ・スループットを参照
229デフォルトの名無しさん:2005/12/18(日) 04:14:49
別スレでも暴れてるようだが、本物のバカだな。
「x86でsubではなくxorが使われるようになった理由」にPen4を持ち出すとは。

まあxorは単独bitで演算できるのは事実だが
8086や80386でレイテンシやスループットに差があったのか
調べてから書き込んだ方が、バカをさらさないで済むと思うぞ。
#俺は調べる気はないから、本当に差がある可能性もあるけどな。
230・∀・)っ-●---- ◆Pu/ODYSSEY :2005/12/18(日) 04:20:02
>>229
攻撃的な人ですね。
事実を証明できない、調べる気もないならそんな縦読みできない長文を赤い顔して書きなさんな。
231デフォルトの名無しさん:2005/12/18(日) 04:29:02
自分以外の書き込みが全部同一人物に見えるのが、デムパの特徴。
232・∀・)っ-●---- ◆Pu/ODYSSEY :2005/12/18(日) 04:33:42
8086は組み込み用途では現役です。まあ初期のものと実装変わってるかもしれないけど
http://www.intel.com/design/intarch/intel186/docs_186.htm
>>229は英語読めるようになってから出直してきてください
233デフォルトの名無しさん:2005/12/18(日) 04:34:47
証明

x86が世に出て、コンパイラがゼロクリアに(x86の)xorを使うようになった時代に
Pentium4は有りませんでした。

証明終
234・∀・)っ-●---- ◆Pu/ODYSSEY :2005/12/18(日) 05:13:32
ADD/SUBのほうがAND/OR/XORより速くなってたらXORじゃなくてSUB使うこと推奨してないし
ノイマン型コンピュータが発明されてから、論理回路の理論は殆ど何も変わってないのですよ。

で、マニュアルによると

ADD/SUB/ADC/SBB
reg/memory with register to either 3/10
immediate from register/memory 4/16
immediate from accumulator 3/4

AND/OR/XOR
reg/memory and register to either 3/10
immediate to register/memory 4/10
immediate to accumulator 3/4
だそうだ。

ftp://download.intel.com/design/intarch/manuals/27095003.pdf

どうみてもXORのが優勢です。本当にありがとうございました。


Pentium4を例として挙げたのは、16ビットのALUを2個束ねたものを動作クロックずつタイミングずらして
実行するものだから。スタガードALUっていうらしいけど。
暇だったらZ80のマニュアルも調べてみて。こいつも「8ビットCPU」だが内部は4bitニコイチ実装だったはず。
235・∀・)っ------- ◆Pu/ODYSSEY :2005/12/18(日) 05:14:55
×XORじゃなくてSUB使うこと推奨してないし
●XORじゃなくてSUB使うこと推奨してるはずだし
236デフォルトの名無しさん:2005/12/18(日) 05:35:28
なんかわからないけど
必死だね
237デフォルトの名無しさん:2005/12/18(日) 09:10:29
・∀・)っ------- ◆Pu/ODYSSEY

↑コイツ同期回路の意味分かってねーな
238デフォルトの名無しさん:2005/12/18(日) 12:08:45
大丈夫、暴れるコテに何言っても無駄だから。
239デフォルトの名無しさん:2005/12/18(日) 13:48:34
よくわからんが、レジスタの中身でなく、メモリをゼロクリアする場合はどうなの?
直接ゼロ書き込むほうが速そうな気もするが・・・

XORだとメモリの内容を一度レジスタに入れて、さらにそれを他のレジスタにコピー
し、XORした結果(当然ゼロ)をメモリにいれることになるよね?

お馬鹿ですまん・・・
240・∀・)っ->229>237>238- ◆Pu/ODYSSEY :2005/12/18(日) 14:34:07
だんごさん無くなったので私怨満々な変な人刺しておきますね。
とりあえず、XORよりSUBでゼロクリアしたほうが速い処理系ってのは存在し得ないでしょ。

他の演算を見ても、仮に半分のビット数のALUを2回使って出力を得るような構成だったとしても、
同じ桁のみの演算で完結するならビット論理演算は繰上げ/繰下げを無視して実行できるから、
XORがSUBと同等かそれより少ないクロックで実行できることはどんな処理系

消費電流の観点から言ってもSUBを敢えて使う理由はない。
全加算器の実装だけど、入力がx, yとci(carry-in), 出力がsとco(carry-out)とすると

s = XOR(XOR(x, y), ci)
co = OR( OR( AND(x, y), AND(x, c0) ), AND(y, c0) )

まぁ基本的な素子もNANDもしくはNORの複数の組み合わせで扱われることが多いんだけど
全加算器でXOR2個分は少なくとも使うわけだから少なくとも必要なゲート数は圧倒的に加算のほうが多い。

引き算は2の補数に変換して1加えたものを足すから、1を最下位ビットの全加算器のcarry-inとして
扱っても、ビット反転+足し算だから、これより更にNOTゲート1個分ずつ増える。


>>239両方の入力に同じレジスタから信号通すように回路を組めばいいでしょ。
レジスタの内容のコピーってなにげに時間かかるよ。
241・∀・)っ->229>237>238- ◆Pu/ODYSSEY :2005/12/18(日) 14:36:44
×2の補数に変換して
×1の補数に変換して

ここは理屈としてはこういうことなんだけど
-x == ~x + 1
242・∀・)っ->229>237>238- ◆Pu/ODYSSEY :2005/12/18(日) 14:48:26
クロックが上がれば上がるほど信号遅延の問題はシビアになってくるよ。
俺に噛み付いてる香具師は電子の移動速度が無限に延ばせるとでも思ってるわけじゃないでしょうけど。

移動速度の限界があるからこそ、Pen4の倍速ALUは32ビットではなく16ビット×2という構成をとらざるを得なかった。
243デフォルトの名無しさん:2005/12/18(日) 16:32:49
なんつーか、そもそも根本から話の観点が間違っているのに自分の風呂敷広げる以外に何も見えなくなっている様が哀れ蚊のようだ。
244デフォルトの名無しさん:2005/12/18(日) 17:43:38
xor使うのは、代入より早くてスマートだって感じで、あとフラグの動作とかで使ってただけだなあ。
subでもよい場面も数多くあっただろうけど、わざわざその場合だけsubにするのは逆に変だし
バグりそうな気がしてね。(あくまで気がするだけでこんなことで本気でバグるとは思ってない)
あと読む人だってxorの方が慣れてるだろうし。

今じゃ、別な意味でxor使うね。(暴れている人の意見に同意)
昔は、xorなんてループの外に出すものと決まってたけど
逆にループの中に入れて毎回実行させるほうが圧倒的に早い場面もあるし。
245デフォルトの名無しさん:2005/12/18(日) 18:27:53
ここってプログラム板ですよね。
一応念のために聞きますが・・・
246デフォルトの名無しさん:2005/12/18(日) 18:39:33
メモリをゼロクリアするとき、アセンブラがこんなん吐きました

ゼロを代入

MOV    #0, R1
MOV.L   R1,@R4

XOR

MOV.L  @R4, R6
MOV.L  @R4, R2
XOR     R2, R6
MOV.L   R6,@R4

コンパイラはSHC(SHっていわれるCPU用のコンパイラ)です(ver9.0)
247デフォルトの名無しさん:2005/12/18(日) 18:40:52
248 ◆Pu/ODYSSEY :2005/12/18(日) 20:38:53
私怨で食って掛かって、論破されるとスレ違いだ云々わめく詭弁者って
どこにでもいるんだよね。

大学時代にとってた教養科目で、算術演算が整数加算しかない仮想
プロセッサで机上プログラミングをする内容の回があったんだが
引き算に補数をとって加算するのを地でやってた。

ネットで調べてみるに、どうやら昔の安いプロセッサって大抵
こういう実装だったらしい。
XOR使うって慣習はこの頃に確立されてたんじゃねーのかね。

算術演算がXOR演算を部分的に利用して実装している以上、XORそのものより
クロック数が多くなることはあっても少なくなることは絶対にないし、
むしろ高クロック化と多ビット化で桁上げの信号遅延が深刻になり、
再び乖離していくんじゃないかと思う。

だからたとえ今XORとSUBが同じクロックで実行できるとしても
ゼロクリアのXORをSUBに強いて置き換える真似はしない。
249デフォルトの名無しさん:2005/12/18(日) 20:59:24
論理回路
AND, OR, NOT, NORとかで
XORとかSUBを実現させようと図を作成してみたら面白いよね。
一気にSUB使いたくなくなる。
250デフォルトの名無しさん:2005/12/18(日) 21:18:34
>>248
こんなところで真面目に言っても意味ない
図に乗るな!って言って止めればよいだけ
251デフォルトの名無しさん:2005/12/18(日) 21:30:42
正論だったとしても一言二言余計な事を書くから叩かれる訳で。
252デフォルトの名無しさん:2005/12/18(日) 21:31:18
まぁ、68000なら0代入は論理差も算術差も使わないのが常道だったわけだが。
253デフォルトの名無しさん:2005/12/18(日) 21:40:19
moveqか
254デフォルトの名無しさん:2005/12/18(日) 21:43:05
なんか遠いところへ来た感じがするな・・・
255デフォルトの名無しさん:2005/12/18(日) 21:43:43
まあ普通面と向かって話してたら、屁理屈言うな、って言われて終わるだけなのが
なぜか2chじゃ勝ちになるっていうわけ分からん不思議世界
256デフォルトの名無しさん:2005/12/18(日) 21:43:50
>246
ごめん、SHってなに?
257デフォルトの名無しさん:2005/12/18(日) 21:44:47
Super Hitoshi
258デフォルトの名無しさん:2005/12/18(日) 21:47:28
勝ちになるってところが重要なポイントだな。
数多く揶揄して、何が何でも勝ち負けに持ち込むんだよな。
259デフォルトの名無しさん:2005/12/18(日) 21:50:29
結局246は何が言いたいの?
260デフォルトの名無しさん:2005/12/18(日) 21:57:35
zeroクリアはimmidiate代入よってことだろ。
MIPS系じゃ命令数もバイト数も増えないし、実行時間も変わらんし。
261デフォルトの名無しさん:2005/12/18(日) 22:21:20
>>246
仕方あるめー、*R4 が必ず同じ値を読み出す保証なんてないから
*R4 ^= *R4; みたいなコード書いたらそのようなコード吐くわな。

>>252-253
MC68000 では clr.l dn より moveq #0,dn の方がなぜか速かったな。
262デフォルトの名無しさん:2005/12/19(月) 19:14:07
よく判らんが、>>248 が論理回路に疎いのは解った。
263デフォルトの名無しさん:2005/12/19(月) 20:03:16
まだ続くのか?
もうどうでもいいだろ
っていうか、どうでもいいっていうこと自体まさにどうでもいいや
264デフォルトの名無しさん:2005/12/19(月) 22:27:11
ここにはいろんな知識人が隠れているのでワクワクします。
265デフォルトの名無しさん:2005/12/19(月) 22:53:13
見るからに自演が多いな
2〜3人でやりあってるんだな
266デフォルトの名無しさん:2005/12/19(月) 23:07:34
僕は外野ですよ
267デフォルトの名無しさん:2005/12/19(月) 23:35:53
実際に xor reg, reg より sub reg ,reg が遅いCPUはあるの?
268デフォルトの名無しさん:2005/12/19(月) 23:36:02
そもそも、ビット演算単独でスレ立てんな。
これならまだconstスレのほうが有意義だったぞ。
269デフォルトの名無しさん:2005/12/19(月) 23:40:57
ビット演算の事を考えると私はこんなにも幸せになれるのです。
270デフォルトの名無しさん:2005/12/20(火) 13:24:14
>>268
俺に聞けスレで興奮した中学生が勃てた
ネタスレですから。
271デフォルトの名無しさん:2005/12/21(水) 18:26:31
ビット演算があればご飯3杯は食べれます
272デフォルトの名無しさん:2005/12/29(木) 15:02:30
SQLにビット演算が無いのって使いにくいよね?
273 【大凶】 【1204円】 :2006/01/01(日) 01:18:11
a
274・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/01/01(日) 01:42:48
いつからこの板VIPクォリティ導入されたんだ?
275デフォルトの名無しさん:2006/01/01(日) 09:56:49
糞コテが書くようになってから。
276デフォルトの名無しさん:2006/01/01(日) 19:11:31
負け犬必死だな
277デフォルトの名無しさん:2006/01/02(月) 01:43:17
なんだと!
278デフォルトの名無しさん:2006/01/12(木) 07:29:29
    ハ,,ハ  ちぽちぽ     
 ~(~(*‘ω‘)        



    ∧∧  ちんぽぽちんぽぽ
    (*‘ω‘)
 〜(,,,ι,J


   ∧ ∧
  (*‘ω‘ *)  ちんぽっぽ
   (   )
    v v
279デフォルトの名無しさん:2006/01/12(木) 15:12:44
ビット演算で使うのって言ったら
やっぱりフラグとトグルスイッチ
280笹井奈琴:2006/01/14(土) 00:20:45
8要素のソート
static void bi_sort( int* a, int* b ) {
        int d = ( *a ^ *b ) & -( ((unsigned int)*b - *a) >> 31 );
        *a ^= d;
        *b ^= d;
}
#define BI(x,y) bi_sort( a+x, a+y );
void oct_sort( int* a ) {
        BI( 0, 1 ) BI( 2, 3 ) BI( 4, 5 ) BI( 6, 7 )
        BI( 0, 2 ) BI( 1, 3 ) BI( 4, 6 ) BI( 5, 7 )
        BI( 0, 4 ) BI( 3, 7 )

        BI( 1, 2 ) BI( 3, 4 ) BI( 5, 6 )
        BI( 1, 3 ) BI( 2, 4 )
        BI( 1, 5 ) BI( 4, 6 )

        BI( 2, 3 ) BI( 4, 5 )
        BI( 2, 4 ) BI( 3, 5 )

        BI( 3, 4 )
}
281デフォルトの名無しさん:2006/01/14(土) 00:45:11
>>272
> SQLにビット演算が無いのって使いにくいよね?

非常におそレスだが、あるやつもあるぞ。
http://www.postgresql.jp/document/pg812doc/html/functions-bitstring.html

まあ、あったからと言って SQL が劇的に使い易くな
るとは思えないが。
282笹井奈琴:2006/01/14(土) 00:50:10
>>281
SQLくらい高級な言語にビット演算があったところで、
高速化しそうな気もしないしな...
ディスク容量は節約できるかな?

>>280
書き忘れたけど、
「分岐なしソート・Pentium4ユーザにお勧め!」ってなとこです。
283デフォルトの名無しさん:2006/01/14(土) 01:06:07
>>282
> SQLくらい高級な言語にビット演算があったところで、
> 高速化しそうな気もしないしな...

いや、その認識はおかしいと思うぞ。
SQL って一行プログラムみたいなもんだから、一つの演算
子の高速化でも結構影響度は高いよ。
なんと言っても、その一行が 10万件とかのデータを処理し
たりするかもしれないからね。
ビット演算子がないがためにいろいろ苦労してやるよりも、
データベースエンジンの最適化も効き易いだろうし。
284・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/01/14(土) 06:19:15
SQLでビット演算が必要なケース・・・マジわからん。mod演算とかで済むんじゃないの?
掛け算・割り算より数クロック早いとかよりもSQLの構文解析のほうがよっぽどクロック数は食うと思う。

SQL文は極力単純にしてデータの加工は極力ローカルでやるってのが高速化の鍵だと思う。
ああ、必要ないデータまで取ってこないってのも大事だけど。


>>282
ヲレならPentium4限定ならSSEx使うと思う。
4byte値なら一度に4つずつ扱えるしね。
285デフォルトの名無しさん:2006/01/14(土) 09:20:02
>>284
> mod演算とかで済むんじゃないの?

言ってることが、マジわからん。

> SQLの構文解析のほうがよっぽどクロック数は食うと思う。

お前、でかい DB 使ったことないだろ。
286デフォルトの名無しさん:2006/01/14(土) 09:46:02
>>285
あるわけねーじゃん。
287デフォルトの名無しさん:2006/01/14(土) 10:31:27
Pu/ODYSSEYこのキチガイ触るべからず
288デフォルトの名無しさん:2006/01/14(土) 10:36:05
今日の団子はここで暴れるのかw
289笹井奈琴:2006/01/14(土) 13:15:44
>>282
そうなんだけど、そうやってSSEを効率的に使うためには、
やはり分岐の無い処理ってのが必要な訳さ。

>>285
ビット演算がmod演算で置き換えられる(?)理由は俺もよくわからんが、
ビット演算が必要な理由もまた良く分からん。
つか、最近のDBMSはSQLをネイティブコードにコンパイルするのでしょうか?
だったらOK、ビット演算したくなる気持ち、
びんびん伝わってくるぜ!
290笹井奈琴/289:2006/01/14(土) 13:17:29
>>282
あ、じゃなくて、もしかしてSSEには
撹拌命令とかがあるから、それを使えばいいってこと?
なるほどねー。
291デフォルトの名無しさん:2006/01/14(土) 14:47:10
>>286-288
安置乙wwww
292デフォルトの名無しさん:2006/01/14(土) 16:03:50
>>289
最近の DB は IP アドレス型とか MAC アドレス型と
か持ってたりするから、ビット演算ぐらいできないと駄
目でしょ。

それより、「ネイティブコードコンパイルされるなら、
ビット演算したくなる」の方がよくわからんのだが…。
293・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/01/14(土) 19:07:52
>>290
正解。NetBurstはロード・ストアをDQWORD単位で行わないと効率が悪いアーキテクチャだからね。
シャッフルうまく使えばL/S回数も減らせてウマーなわけです
イミディエイトの値が決めうちだからAltiVecみたいにはいかないのが難点だけど。
あとmax/minの判定するそのものズバリなインストラクション用意されてるし。

>>292
そういうことか。でもどうせサブネットマスクの生成とかっしょ。構文あるじゃん。
OracleやDB2やらにやらす必要あるわけ?
まさかDB使ってDNSやNAT、ARP/RARPのサービスの再発明しようとしてるわけじゃないよな?
294デフォルトの名無しさん:2006/01/14(土) 19:56:31
パイプラインを詰まらせるシャッフルが新しいボトルネックになって
ストールしまくりで全然解決しない気がするんだが。
295・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/01/14(土) 20:08:10
アンパック(インタリーブ)命令でもできるかも・・・ちと叩き台のコード書いてみるか。
コンパイルオプションでCMOV使うようにすればいいだけ、という考え方もできる。

今使ってるマシンPentium Mなんだよな。NetBurstシミュレータって無い?
296デフォルトの名無しさん:2006/01/15(日) 23:30:59
Pen4のSIMDはかなり並列実行に強いから
直列処理じゃなくて何個かソートを並列して実行できれば
いい感じになるんじゃないかな。
297デフォルトの名無しさん:2006/01/17(火) 16:15:38
あぁ痛いコテが常駐している・・・
298デフォルトの名無しさん:2006/01/17(火) 16:18:58
こういうのを本当に除外したけりゃ全員で完全無視すりゃいい
299デフォルトの名無しさん:2006/01/17(火) 16:53:00
>>283
ビット演算の有無による効率を考える前に
物理的にひとつの値に論理的に複数の意味を付加しようとする
頭のおかしい設計者を排斥した方がいいと思うが。

クロック単位で云々ぬかす莫迦もどうにか排斥できないものかね。
300松田成子:2006/01/17(火) 16:54:09
ビビっと来た!
301デフォルトの名無しさん:2006/01/17(火) 16:54:23
>物理的にひとつの値
>物理的にひとつの値
>物理的にひとつの値
>物理的にひとつの値
>物理的にひとつの値
>物理的にひとつの値
>物理的にひとつの値
302∀<)っ-●○◎- ◆Pu/ODYSSEY :2006/01/17(火) 17:59:55
空気を読まずに>>280のAltiVecバージョン。元のコードの片鱗も無いけど。
あー、16byte境界にあわせてあること前提ね。

#include <altivec.h>
void vQuickSort(int e[8]) {
register vector int v1, v2, v3, v4;
v1 = *((vector int)&e[0]); // lvx
v2 = *((vector int)&e[4]); // lvx
v3 = vec_max(v1, v2); // vmaxsw
v4 = vec_min(v1, v2); // vmaxsw
v1 = vec_mergeh(v3, v4); // vmrghw
v2 = vec_mergel(v3, v4); // vmrglw
v3 = vec_max(v1, v2); // vmaxsw
v4 = vec_min(v1, v2); // vmaxsw
v1 = vec_mergeh(v3, v4); // vmrghw
v2 = vec_mergel(v3, v4); // vmrglw
v3 = vec_max(v1, v2); // vmaxsw
v4 = vec_min(v1, v2); // vmaxsw
v1 = vec_mergeh(v3, v4); // vmrghw
v2 = vec_mergel(v3, v4); // vmrglw
*((vector int)&e[0]) = v1; // stvx
*((vector int)&e[4]) = v2; // stvx
}

たった16オペレーションで済む。ちなみに8bit×32要素なら24オペレーション。
ただ、依存関係があるから並列実行性能はそんなに良くない。
VSIUとVPERMはMPC7400/7450, PPC970いずれでも並列動作可能だが
このコードの場合どこにも並列化可能なところがない。
ただし要素数がもっと増えれば、たとえば4byte×16とかなら並列化は有効。
303∀<)っ-●○◎- ◆Pu/ODYSSEY :2006/01/17(火) 18:00:26
あと、こいつのSSExへの応用だけど、x86の演算はSSExも含めて全て破壊的だから
max/minをとるたび、インタリーブするたびにレジスタの値をコピーする必要がある。
しかし、Pentium4レジスタ間のmovq/movdqaのレイテンシが異常にデカイから困る。
まあPentiumMとかMeromあたりではあんま関係ないだろうけど。

なお、IntelのSIMDクラスライブラリには vec_merge{h,l} に対応する unpack_highと
unpack_lowがあるから、ただコードを移植するだけならかなり簡単。
304)っ-●○◎- ◆Pu/ODYSSEY :2006/01/17(火) 19:22:02
ここだけ訂正しとく

- v1 = *((vector int)&e[0]); // lvx
- v2 = *((vector int)&e[4]); // lvx
+ v1 = *((vector int*)&e[0]); // lvx
+ v2 = *((vector int*)&e[4]); // lvx

- *((vector int)&e[0]) = v1; // stvx
- *((vector int)&e[4]) = v2; // stvx
+ *((vector int*)&e[0]) = v1; // stvx
+ *((vector int*)&e[4]) = v2; // stvx

Cで考えれば結構簡潔に見えるけど2オペランドベースでレジスタが少ないことを
前提としたロジックって考えるの結構大変だと思う。
特にターゲットがPentium 4みたいな変態マイクロアーキテクチャだと特に
movやpush,pop命令吐きまくりでちっとも早くならないなんてことは結構ある。

所詮はCなんかも3オペランド命令ベースでレジスタが豊富な命令セットアーキテクチャ
向けの言語ってことね。
305デフォルトの名無しさん:2006/01/18(水) 00:06:48
>所詮はCなんかも3オペランド命令ベースでレジスタが豊富な命令セットアーキテクチャ
>向けの言語ってことね。

( ゚д゚)ポカーン
306笹井奈琴/289:2006/01/18(水) 00:18:56
>>302
(1) v1とv2の要素を一個ずつ比較して、大きいのをv3に、小さいのをv4に入れる
(2) v3の前2個とv4の前2個ずつをv1に、v3とv4の後2個ずつをv2にいれる

これを3回繰り返すだけで8要素のソートになるのかー。
面白いなAltiVec。漏れもマカーなので試してみようっと。
307・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/01/18(水) 00:20:35
何を今更。
知ってる?GCCってレジスタが大量にある3オペランド演算ベースの仮想マシン向けにコード生成して
それから各CPU向けに帳尻合わせするのよ。
PowerPCなんかはまともなのにx86向け最適化がウンコなのってそのせいよん。
308デフォルトの名無しさん:2006/01/18(水) 00:29:52
言語仕様として i++ とかもってる言語に...

>所詮はCなんかも3オペランド命令ベースでレジスタ
>が豊富な命令セットアーキテクチャ向けの言語って
>ことね。

ねぇ...。アセンブラ以外に、C言語より RISC 向き
の言語を教えて欲しいものだ。
309デフォルトの名無しさん:2006/01/18(水) 00:44:04
副作用が発生しない3オペランド。
レジスタ数が多ければソースを破棄しても痛くはない。
当然自由度が高くなる。

下らん事をいまさら自慢げに書かれてもなぁ・・・

真にC言語向きなのはアドレッシングモードが豊富なCICS。と書いてみるテス(ry
310デフォルトの名無しさん:2006/01/18(水) 00:46:05
CICS CISC orz
311笹井奈琴/289:2006/01/18(水) 00:53:50
>>309
68000系は、なんかアドレッシングモードがCに最適化してあったとか、
聞いたことがあります。

>>307
それでx86向けの最適化だと、Intelのコンパイラに遅れをとるのね。

>>309
まあ、そのくだらないことも、
書いてくれないと、漏れとか知らない訳だし。

そもそもここ、厨房向けっぽいらしいし。
312・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/01/18(水) 07:23:27
>>306
やってることは、1位から最下位まで全部順位の出るトーナメント戦です。
人数がn人なら一人当たりlog(n)/log(2)回対戦すればいいことになります。今回は8人だから3回対戦すればいい。
最終的な並びはvec_perm(vperm)使ってやればもう好きなようにやってヨシ。

>>309
だってMMX/SSEって痛い仕様なんだもの。
pandnってあるじゃん。 a = ~a & b
マスク破壊されるじゃん。なんで a = a & ~b じゃないの。みたいな。
Appleのデベロッパー向けサイトでもその点について言及してたが。


今回問題になる点は
 「値を破壊される前に退避してください。あ、Pentium 4ではmovqもmovdqaもレイテンシ大きいからね」

どないせいっちゅうねん。まぁだから整数演算はPentium Mに負けるんだろうけど。
unpack high( or low)オペレーションって対として使うケースのほうが多いと思うんだけど。
このへんだけでも3オペにしてくれれば良かったのにさ。

で、オレみたいにAltiVecを使いたいがためだけにIntel移行発表後にPPC版Macを買う厨房もいるわけだ。
313・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/01/18(水) 07:28:26
あ、ごめん。。。これ欠陥があった。
最初の比較で1番目に大きいものと2番目に大きいものが比較されたら・・・。

正確に出るのは最上位と最下位だけか。
314デフォルトの名無しさん:2006/01/18(水) 11:51:29
>だってMMX/SSEって痛い仕様なんだもの。
>pandnってあるじゃん。 a = ~a & b
>マスク破壊されるじゃん。なんで a = a & ~b じゃないの。みたいな。

どっちが楽か考えれば理由はわかる。
マスク値を保持するにはコピーするか2回notするしかないからね。

>このへんだけでも3オペにしてくれれば良かったのにさ。

Instruction Formatを見てどうすればいいか考えてみてくれよ。
これ以上デコーダを複雑にならないようにできるならな・・・
315 ◆Pu/ODYSSEY :2006/01/18(水) 12:16:16
うーん
デコーダだけの問題だとすればなら、パイプラインから分離されてる
NetBurstアーキテクチャならx86のコード体系とはかなり違うSIMD拡張
命令フォーマットってサポート可能だったんじゃないの?
まぁIntelも従来型CRISC殺す気も無かったんだろうな。
NetBurstを継続しAMDに嫌がらせするには絶好の拡張方法に違いない。
まあ消えるけど。
316デフォルトの名無しさん:2006/01/18(水) 12:34:26
だ・か・ら、Instruction Formatを見てどこに追加のレジスタ情報を埋めればいいか自分で考えてみろって。
317 ◆Pu/ODYSSEY :2006/01/18(水) 12:59:14
わたすは脳内CPUアーキテクトじゃないので、「既存のものを使う」としか答えません。
まぁ一般に普及してればの話ですがx86互換CPU(と言っていいのか?)では
Itaniumが理想です。
318 ◆Pu/ODYSSEY :2006/01/18(水) 13:13:43
>>316
opcode・src1, src2, destでもopcode・dest・src1・src2でも
何か不都合でも?
困難なのは知ってますが、互換ベンダが実装が困難なもの作ったほうが優位でしょ。

レジスタ間move命令のレイテンシが十分に短くて命令帯域に余裕があるなら
既存のものでも十分だとは思ってはいるけど、NetBurstはどっちも×だから。
まぁ半年後には死ぬアーキテクチャについて語る未来はないし
不毛なことは考えませんよ。
ただ、AltiVecからSSEへの移植は苦労するだろうなって話。
319デフォルトの名無しさん:2006/01/18(水) 15:04:01
MMX,SSEだけはModR/MやSIBの意味を変えろと言っているのか?

汚いx86がさらに汚くなってうんざりだな。
320デフォルトの名無しさん:2006/01/18(水) 17:18:50
消えてるから何が起こってるか分からないけど
消えっぷりが半端で無いので笑える
ファビョって連レス乙
321デフォルトの名無しさん:2006/01/18(水) 17:29:18
あぼ〜んせずに観察するのも
それもまた由
322 ◆Pu/ODYSSEY :2006/01/18(水) 18:35:04
>>319
消えるアーキだからもうどうしようもないけど、せっかく分厚いデコード層で
仮想化してるんだから、この際それくらいやって欲しかったけどねー。
もしくはデコード無しでダイレクトにトレースキャッシュにμOPsをロードする
命令をサポートするとか。これならx86の命令セット自体は汚れない。

ま、こんなことやっても盲腸がまた増えるだけ、ってのはわかってるけど。
323 ◆Pu/ODYSSEY :2006/01/18(水) 19:34:05
お題:地味で出番の少ないpmovmskbの有効活用法について
void Transpose8x8(BYTE a[8], BYTE b[8]) {
_asm { //8x8のビット配列の転置, 最適化あんまやってない
movq mm0, mmword ptr [a]
pmovmskb eax, mm0
mov byte ptr [b+7], al
paddb mm0, mm0
pmovmskb eax, mm0
mov byte ptr [b+6], al
paddb mm0, mm0
pmovmskb eax, mm0
mov byte ptr [b+5], al
paddb mm0, mm0
pmovmskb eax, mm0
mov byte ptr [b+4], al
paddb mm0, mm0
pmovmskb eax, mm0
mov byte ptr [b+3], al
paddb mm0, mm0
pmovmskb eax, mm0
mov byte ptr [b+2], al
paddb mm0, mm0
pmovmskb eax, mm0
mov byte ptr [b+1], al
paddb mm0, mm0
pmovmskb eax, mm0
mov byte ptr [b], al
emms
}}
324デフォルトの名無しさん:2006/01/18(水) 20:07:57
VC++7.1の_MM_TRANSPOSE4_PSが酷過ぎる件について。
325 ◆Pu/ODYSSEY :2006/01/18(水) 21:10:27
姉さん、 pcmpeq* mmX mmX で任意のレジスタの全ビットを立てる
組み込み関数が無いのは何かの嫌がらせです。

もっとも、 a = _m_paddd(a, a); で生成されるコードのアホさ加減を見れば、
VC++のレジスタカラーリングなんて全くあてにしたくないわけで。
326デフォルトの名無しさん:2006/01/19(木) 00:39:35
>>322
>消えるアーキだからもうどうしようもないけど、せっかく分厚いデコード層で
>仮想化してるんだから、この際それくらいやって欲しかったけどねー。

そういう問題じゃないって言っているだろ。
x64も同じ問題を持っている。ビット演算スレなんだから命令とオペランドの
ビットパターンを見てから発言すれば?

pandn命令を2オペランドでやるとすればデータとマスクどちらを破壊するのが
良いかはマスク破壊が正しいのでは?大量のデータを処理する際にスループットは
どうにもできないけどレイテンシは投機的な処理で隠蔽できます。では、一般的に
マスクとデータのどちらが投機的にロードし易いか?
内部のロジックだけでなく用途を考えても答えはでますよね。

所要クロックスレの1の方がマシだな。
327デフォルトの名無しさん:2006/01/19(木) 05:22:22
キチガイ出没記念カキコ
328デフォルトの名無しさん:2006/01/19(木) 06:40:35
ん? >>327 が キチガイ?
329・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/01/19(木) 08:16:25
>>326
反転するほうが保持したいデータだった場合は?そんなの場合によるだろ。
第1オペランドに入れる値のほうは明示的にレジスタにロードしないといけない。
しかもそれを破壊しないといけない。

おいら的問題は、
・NOT(全ビット反転)を取るのが1命令でできない
・替わりにあるpandnが異常に使い勝手が悪い

まぁ正確に言えば両方サポートして欲しい。
あと、pornとかpnorとかも欲しいかな。NORなら単独でNOT演算ができる。


で、MMX/SSEでビット反転の手段
pcmpeqでレジスタ1個潰して全ビット立ててpxor
もしくは全ビット立ったQWORD/DQWORD値をメモリに持っておいて
pandn(Intelのラッパー関数はこーやってるようだ)、あるいはpxor
330デフォルトの名無しさん:2006/01/19(木) 11:44:25
見事に >>1 の通りのスレになってよかったな。
331デフォルトの名無しさん:2006/01/19(木) 17:29:35
pandn,por,pxorで十分と思わない奴は。。。
332デフォルトの名無しさん:2006/01/19(木) 19:53:33
>>326
>マスクとデータのどちらが投機的にロードし易いか?

データはどっちにしろロードするわけで・・・
両方ロードするのと、データだけロードするのとどっちが良いかという話では?
333デフォルトの名無しさん:2006/01/24(火) 16:44:16
まめめ
334デフォルトの名無しさん:2006/01/24(火) 18:46:41
お団子の匂いがしたのでよってきますた。
335デフォルトの名無しさん:2006/01/26(木) 12:13:05
団子さんって博識ですね。
団子さんみたいになるには、何を勉強すればいいのでしょうか?
336・∀・)っ-○○◎- ◆.CzKQna1OU :2006/01/26(木) 14:49:00
ひ・み・つ♪
337デフォルトの名無しさん:2006/01/26(木) 15:54:45
おい団子
お前はHONDA車に乗ってる事はおみとおしだ。
338デフォルトの名無しさん:2006/01/26(木) 18:15:16 BE:238367096-
>>336
トリがいつもと違う様な・・・
339>∀<)っ-○●◎- ◆Pu/ODYSSEY :2006/01/26(木) 20:32:13
PAJERO大好き
340335:2006/01/26(木) 21:47:30
>>336
そんなこと言わないで教えてください><
341デフォルトの名無しさん:2006/01/27(金) 11:13:54
おい団子!新ネタ投下汁
342デフォルトの名無しさん:2006/01/27(金) 12:19:32
>>341
団子汁
343デフォルトの名無しさん:2006/01/28(土) 21:22:35
過疎ったな
344デフォルトの名無しさん:2006/01/29(日) 09:21:38
まだ変なコテいたんだ。
色んなスレを荒らしまわってるデムパ乙。
自分を攻撃してくるやつは全て同一人物だと思ってしまうかわいそうな子。
345>∀<)っ-○●◎- ◆Pu/ODYSSEY :2006/01/29(日) 15:30:56
ネタも用意しないで噛み付くのが目的ならスレに不要と思われるけど。どっちが荒らしか自覚したほうがいいw
346>∀<)っ-○●◎- ◆Pu/ODYSSEY :2006/01/29(日) 15:43:32
>>341
SSEのmaskmovq, pextrw, pinsrwの活用法について考える、とか。画像処理以外で。
こいつは巧いと思った。
http://www.dawgsdk.org/tripmona/index.php/optimization
347デフォルトの名無しさん:2006/01/29(日) 16:17:27
xor 団子, 団子
348デフォルトの名無しさん:2006/01/29(日) 19:04:08
>∀<)っ-○●◎- ◆Pu/ODYSSEY >> 64

シフトではみ出た桁は0になる
349デフォルトの名無しさん:2006/01/29(日) 19:06:59
>>348
IA-32だと何も変わらないがなw
350デフォルトの名無しさん:2006/01/30(月) 12:16:53
>>345
>どっちが荒らしか
そりゃあ、糞コテの方に決まっている。内容を読むまでもない。
351デフォルトの名無しさん:2006/01/30(月) 16:08:25
仲良くしてやって><
352デフォルトの名無しさん:2006/01/30(月) 17:09:01
保護者なら保護者らしく糞は引き取れ
353デフォルトの名無しさん:2006/01/30(月) 17:35:49
保護者ではないです><
354366:2006/01/30(月) 20:09:16
うんこうんこうんこー
355デフォルトの名無しさん:2006/01/31(火) 06:22:07
晒しage
356デフォルトの名無しさん:2006/02/03(金) 12:14:52
固定長命令と可変長命令のメリット、デメリットを教えてください
357デフォルトの名無しさん:2006/02/03(金) 14:49:11
まず自分で考えてからな。
358デフォルトの名無しさん:2006/02/04(土) 10:29:24
>>356
基本情報の教科書でも読んでろ
商業高校にでも行って
359デフォルトの名無しさん:2006/02/04(土) 11:19:37
360デフォルトの名無しさん:2006/02/05(日) 19:29:08
ten byteがサポートされているのはインテルのみ?
361デフォルトの名無しさん:2006/02/05(日) 21:47:49
>>356
・柔軟
・速い
362デフォルトの名無しさん:2006/02/06(月) 01:00:53
保護者出てこいヴォケ
とうとう自作板にまでしゃしゃり出て来るようになったぞ
363デフォルトの名無しさん:2006/02/06(月) 04:10:01
悪い子じゃないんです。
学位だって持ってるんです。
ちょっとあおり耐性が足りなかっただけなんです。
仲良くしてあげて><
364デフォルトの名無しさん:2006/02/06(月) 07:35:25
>>362
どこ?
365デフォルトの名無しさん:2006/02/06(月) 07:42:48
ヒント 半可通は半可通を呼ぶ
366デフォルトの名無しさん:2006/02/06(月) 09:04:36
ここに潜伏してる人達はだんごを余裕でねじふせられる程の猛者揃いですか?
367デフォルトの名無しさん:2006/02/06(月) 09:11:16
ねじ伏せるという発想が既に嵌っているまさに泥沼首まで・・・!

つーかキチガイと張り合うのはキチガイだけ。相手にしないといい
368デフォルトの名無しさん:2006/02/06(月) 12:16:33
ねじ伏せるも何も間違い指摘スルーじゃ話にならん。
369デフォルトの名無しさん:2006/02/08(水) 11:08:29
団子は間違いを犯しますか?
370デフォルトの名無しさん:2006/02/08(水) 11:38:27
俺の団子は時々間違いを犯します
371デフォルトの名無しさん:2006/02/08(水) 12:47:07
時々俺は間違って団子を犯します
372デフォルトの名無しさん:2006/02/08(水) 16:26:32
時々犯しますは俺に団子を間違います
373デフォルトの名無しさん:2006/02/08(水) 16:38:37
意味がわからんので構文木も書いてくれ。
374デフォルトの名無しさん:2006/02/08(水) 18:13:58
そろそろ話題をシフト
このスレ = このスレ >> 374;
375デフォルトの名無しさん:2006/02/08(水) 21:44:31
厨房くさいトリッキーな高速化テクニックを集めてみませんか?
376デフォルトの名無しさん:2006/02/08(水) 21:59:54
>>375
団子が来ますよ?
377デフォルトの名無しさん:2006/02/08(水) 22:33:32
1ビットだけ立ってる整数の、どのビットが立ってるのか調べる方法ありますかねえ。
例えば16→4、 128→7、 1→0を返す様な。

1引いてループ分岐なしビットカウント、でもいいのだけど
「1ビットしか立っていない」って条件を生かすと
もっと少ない手間で出来そうな気がする。
378デフォルトの名無しさん:2006/02/08(水) 22:50:49
>>377
>もっと少ない手間で出来そうな気がする。

表引き。
379>∀<)っ-○●◎- ◆Pu/ODYSSEY :2006/02/08(水) 22:52:06
ハード依存だが浮動小数に変換してメモリに保存→整数で指数部を読み出し
380>∀<)っ-○●◎- ◆Pu/ODYSSEY :2006/02/08(水) 22:54:29
>>378
表引きなら何ビット立ってようが同じ希ガス
381デフォルトの名無しさん:2006/02/08(水) 22:59:02
>>377

x86なら bsf/bsr で十分速い
と書くと団子が能書き垂れ始めます

ていうか逆にビット位置を保持してそれからビットを作れよ
382デフォルトの名無しさん:2006/02/08(水) 23:09:11
>>376
来ますたよ?
あーあ
383デフォルトの名無しさん:2006/02/08(水) 23:13:33
>>377
やってることはlog(x,2)の簡単化
素直にbsr でいいんじゃない?
384>∀<)っ-○●◎- ◆Pu/ODYSSEY :2006/02/08(水) 23:14:13
> nをスキップする0の数として、だいたい11+2*nクロックサイクルかかる。

( ´,_ゝ`)プッ
385デフォルトの名無しさん:2006/02/08(水) 23:25:11
"\0\0\1\32\2\27\33\0\3\20\30\36\34\13\0\15\4\7\21\0\31"
"\26\37\17\35\12\14\6\0\25\16\11\5\24\10\23\22"[i%37u];

ジョークで書いてみたものの除算が入るから遅いだろうなぁ
386デフォルトの名無しさん:2006/02/08(水) 23:31:19
BSF or BSR
387>∀<)っ-○●◎- ◆Pu/ODYSSEY :2006/02/09(木) 00:00:33
uint8 table = {
32, 0, 1,12, 2, 6, 0,13, 3, 0, 7, 0, 0, 0, 0,14,
10, 4, 0, 0, 8, 0, 0,25, 0, 0, 0, 0, 0,21,27,15,
31,11, 5, 0, 0, 0, 0, 0, 9, 0, 0,24, 0, 0,20,26,
30, 0, 0, 0, 0,23, 0,19, 29, 0,22,18,28,17,16, 0
};
table[ (i*0x0450FBAF) >> 26];

クォリティ低いスレだな。
388>∀<)っ-○●◎- ◆Pu/ODYSSEY :2006/02/09(木) 00:01:39
uint8 table[] {
ほげほげ
};

Rubyでテストして変換し損ねたwww
389385:2006/02/09(木) 00:07:29
>>387
あー定数の除算は乗算+シフトに置き換えれたんだったなー
結構面倒だったでしょ。お疲れさんw
390>∀<)っ-○●◎- ◆Pu/ODYSSEY :2006/02/09(木) 00:17:05
マジックナンバーを自動計算するスクリプト組んでSIMDとかこの手の最適化に活用してる。
391デフォルトの名無しさん:2006/02/09(木) 00:47:48
で?
それ速いの?
392・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/09(木) 01:49:09
試せよ。


毒吐こうかと思ったけどやっぱり辞めた。x86じゃなかったらどういうコード書く気だかそっちのほうが気になるわ。
393デフォルトの名無しさん:2006/02/09(木) 01:53:19
答えは>>383で出ているわけだが
394・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/09(木) 02:16:42
x86じゃなかったら
395・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/09(木) 02:21:40
ビットカウントのアルゴリズムを把握してる人間がそもそも誰でもわかるようなx86依存の専用命令を
答えられて納得するとでも思うのかな?テラクォリティ低す
396デフォルトの名無しさん:2006/02/09(木) 02:27:44
>>381の言う通りでペタワロシュwwww
397・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/09(木) 02:33:33
CPU依存の一命令がないとまともにアルゴリズムを組めない人なのですか?>>381は。
398デフォルトの名無しさん:2006/02/09(木) 02:49:12
このスレが大好きです
399デフォルトの名無しさん:2006/02/09(木) 05:02:07
偉そうに能書きたれている誰かさんのコードも環境依存があるしな。www
400デフォルトの名無しさん:2006/02/09(木) 07:38:52
もはや一つのショウだなこのやりとりは
401デフォルトの名無しさん:2006/02/09(木) 14:54:59
あらゆる環境で動かないと意味が無い
402デフォルトの名無しさん:2006/02/09(木) 15:05:59
ポータビリティなんか考えてる奴はバカ。
別の環境で動かしたいなら
その時に変換すりゃいいだろ
403デフォルトの名無しさん:2006/02/09(木) 15:10:32
複数の環境をターゲットにしてる人もいる
人それぞれいろんな状況があるんだよ
404デフォルトの名無しさん:2006/02/09(木) 15:21:38
自慢のロジックでもテーブル参照ですかw
405デフォルトの名無しさん:2006/02/09(木) 15:23:57
>>402はx86以外なら一個一個ループを回していくらしい
406デフォルトの名無しさん:2006/02/09(木) 15:28:19
>>402
逆だろ。
あらゆる環境で動くものを用意しておいて、ハード依存の高速化手法があればそれを適用すればいい。
ハードありきな回答しか出せないのを居直る時点で駄目駄目。
407403:2006/02/09(木) 15:37:20
(読まずに脊髄レスしたのは内緒だ....)
408デフォルトの名無しさん:2006/02/09(木) 15:41:53
あらゆる環境で動くコードとは
あらゆる「ハードありき」のコードの寄せ集めだろ。

試しにあらゆる環境で動作する
ハードに依存しないコードとやらを書いてみろよ
409デフォルトの名無しさん:2006/02/09(木) 15:46:44
逆に、ためしにSHやPOWERにBSRを移植してみてくれよ。

68kやAlphaのBSRはどうみても別物です。
本当にありがとうございました。
410デフォルトの名無しさん:2006/02/09(木) 15:52:43
Cで書けば移植性ほとんど困らないじゃん。
コンパイラが四則演算・ビット論理演算・ビットシフト演算、諸々を
ネイティブコードに置き換えてくれることを保障してくれる。
馬鹿だね。
411デフォルトの名無しさん:2006/02/09(木) 15:57:36
要するにどこでネイティブコードに変換するかって話で
Cコンパイラはコンパイル時にそれをやってるだけの事
馬鹿も糞もねーよ。
ハードが隠蔽された高級言語こそが偉いと言うなら
c++.netでもjavaでもスクリプト言語でもなんでもいいからどっかいっとけ
412デフォルトの名無しさん:2006/02/09(木) 15:58:31
つか、専用命令がなくても使えるジェネリックなビットスキャンアルゴリズムを聞いてるのに
「○○には組み込みの命令が用意されてるからそれを使え」じゃ全く話にならないと思うが。
逆に使えなかったら>>405みたいな解決法なんだろ。くだらねー。

>>411
>>409
413デフォルトの名無しさん:2006/02/09(木) 16:20:46
レギュレーションが各自の脳内にあるから荒れるのは仕方が無い。
414デフォルトの名無しさん:2006/02/09(木) 16:56:03
有名なビットカウントアルゴリズムだけど

int numofbits5(long bits) {
 bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
 bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
 bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
 bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
 return (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff);
}

これは?
415デフォルトの名無しさん:2006/02/09(木) 17:00:08
>>414
散々既出な上に、立ってるビットの数は1個と決まってるので話題違い。



とりあえずPentium 4で確認したがBSF/BSRは「遅い」。
Northwoodでレイテンシ-スループットは8-4, Prescottで16-2。
わざわざ移植性を犠牲にしてまで利用する価値があるかは、疑問。

掛算とシフトとロードは並列動作可能なので何個か同時処理すれば>>387のが
速いかもしれんね。

定数との剰余(or掛け算+シフト)を使って一意なダイジェストを得るのは
かなりうまい方法だな。1バイトずつ分割してテーブル参照すると遅いし。

ただ、SIMDじゃ基本的にテーブル参照は使えないんで、論理・算術演算のみ
を使ったいい方法があればと思う。
AltiVecで16bit程度までならAltiVecレジスタ上にテーブルを展開できそうだから、
>>387的な手法+vpermで写像をとって解決できるのだが。
416デフォルトの名無しさん:2006/02/09(木) 17:00:11
>>414
その素朴な方法だと無駄が多い。
最低でもこれくらいにしなきゃ

int numofbits5(unsigned long bits) { 
    bits -= bits >> 1 & 0x55555555;
    bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333); 
    bits = (bits + (bits >> 4)) & 0x0f0f0f0f; 
    bits += bits >> 8;
    bits += bits >> 16; 
    return bits &0xFF; 
}

ただ、テーブル使う方が俺は好みだけどな
417デフォルトの名無しさん:2006/02/09(木) 17:07:09
名無し乙
418デフォルトの名無しさん:2006/02/09(木) 17:22:59
コンパイラの最適化に依存しそうだがこれでよくね?

c = (0xFFFF < n) * 16
n = n >> 16 | n & 0xFFFF;
c += (0xFF < n) * 8;
n = n >> 8 | n & 0xFF;
c += (0xF < n) * 4;
n = n >> 4 | n & 0xF;
c += (0x3 < n) * 2;
n = n >> 2 | n & 0x3;
c += n - 1;
419デフォルトの名無しさん:2006/02/09(木) 17:23:04
static inline unsigned count(unsigned long bits)
{
bits -= bits >> 1 & 0x55555555;
unsigned tmp = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
tmp += tmp >> 4;
tmp &= 0x0f0f0f0f;
tmp += tmp >> 8;
tmp += tmp >> 16;
return (unsigned char) tmp;
}
static inline unsigned count(unsigned short bits)
{
bits -= bits >> 1 & 0x5555;
unsigned tmp = (bits & 0x3333) + (bits >> 2 & 0x3333);
tmp += tmp >> 4;
tmp &= 0x0f0f;
tmp += tmp >> 8;
return (unsigned char) tmp;
}
420デフォルトの名無しさん:2006/02/09(木) 17:29:26
まる一日考えたが、1引いてビット数え上げするより速い方法は思いつかん
分岐・テーブル不要で32bit数をlog_2に折り畳むには、最低限5回の加算は必要な気がする
421デフォルトの名無しさん:2006/02/09(木) 17:33:56
いっそジャンプテーブルで分岐させる
422 ◆Pu/ODYSSEY :2006/02/09(木) 19:10:39
ビット1個しか勃ってねーんだからこれでいいじゃん。
依存関係が無いからSIMDでもVLIWでもこれでスケジューリング楽々。

!(0x0000FFFF & n) * 16 + !(0x00FF00FF & n) * 8 + !(0x0F0F0F0F & n) * 4
+ !(0x33333333 & n) * 2 + !(0x55555555 & n) ;
423デフォルトの名無しさん:2006/02/09(木) 21:06:59
>>422
x86向けだけど、コンパイルしたらこんなコードになった
and edx,0xFFFF ; cmp edx,1 ; sbb ecx,ecx ; neg ecx ; shl ecx,4 ; 後略
でも、gccだとどうオプションつけても分岐ができちゃった
424デフォルトの名無しさん:2006/02/09(木) 21:15:54
速度が気になるならハード依存のコードを書けばいいし
そうでないなら分岐使いまくりスタック操作しまくりの糞コードでいい。
糞コードでもいいならば単純な置換でいいんだし
別のハードで動かす場合に速度が必要になった時にだけそのハード専用のコードを書けばいい。
つまるところハード依存を気にせず良いと思ったコードを書くのが一番だ。
425424:2006/02/09(木) 21:16:26
ごめんよ。たぶんスレ間違った
426デフォルトの名無しさん:2006/02/09(木) 21:19:37
>>425
どうみても誤爆に見えないぐらいスレに沿ってるw
427424:2006/02/09(木) 21:25:18
じゃあ合ってた

団子がどこにでもいるから一瞬どこに書いたのかわからん
428デフォルトの名無しさん:2006/02/09(木) 21:40:30
RISCだと命令セットが単純だから、どのハードでも最速コードが同じになることが多い
ハッカーズ・ディライトもそういう前提で書かれてたんじゃなかったかな?
標準コンパイラのgccで団子鬼門の分岐ができちゃうんじゃ使えない気がする
429デフォルトの名無しさん:2006/02/09(木) 21:42:04
gccだと-march=pentiumproとかで分岐はなくなった
430・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/02/09(木) 23:03:11
>>423
コンパイラによってはひょっとしたらこっちのほうが効率いいかも。
(0x0000FFFF & n ? 0 : 16) + (0x00FF00FF & n ? 0 : 8) + (0x0F0F0F0F & n ? 0 : 4)
+ (0x33333333 & n ? 0 : 2) + (0x55555555 & n ? 0 : 1);

>>422は単に「こうやったらleaを吐くんだろーな」とか思って書いたもので
これが最速という確証とかも無し。
むしろテーブル参照のほうが速いでしょ。

-(expr)>>31とかやってやれば確実に0か1を取り出せるし、更にnegをとれば全ビット1か0に。
まあコンパイラの最適化性能を最大限生かしたいタチなのでこういうコードにしたけど、
ショボければショボイコードができることを意味する。まあ工夫は各自で。

>>429
x86ではsbbかcmov*を使ってくれること前提で書いた。
最適化無しの状態だとVC++でもヤバいコード吐くね。

GCCの最適化は安定しないので基本的にあてにしない。




HDの和訳本無くしたかも。文庫サイズなんで持ち歩きに便利だから買ってたけど><
まぁ原著(わざわざAmazon経由で海外から取り寄せで購入)は家においてるんで支障ないが。
431笹井奈琴/377:2006/02/10(金) 01:01:28
オマイら、ありがとう。
たすかったよ。
432デフォルトの名無しさん:2006/02/10(金) 10:46:30
おk
433デフォルトの名無しさん:2006/03/08(水) 23:29:07
XORを使うとテンポラリ領域なしで値交換できると聞きました。
本当でしょうか?
434デフォルトの名無しさん:2006/03/08(水) 23:34:05
本当です。
435デフォルトの名無しさん:2006/03/08(水) 23:41:51
詳しく教授してください
436デフォルトの名無しさん:2006/03/08(水) 23:44:39
お前は現行スレ内を検索することも出来ないのかと
あと氏ね
437デフォルトの名無しさん:2006/03/08(水) 23:45:37
ビット演算における偉い演算ランキングは
xor, and, not, 論理右シフト, or, 左シフト, 算術右シフトで異論はないね?
438デフォルトの名無しさん:2006/03/08(水) 23:52:26
>>436
放置した方がいいよ
439デフォルトの名無しさん:2006/03/08(水) 23:54:20
ローテートが抜けている。
440デフォルトの名無しさん:2006/03/08(水) 23:57:32
団子マダー?
441デフォルトの名無しさん:2006/03/09(木) 00:41:09
>>433
できるけど、今時のCPUだと却ってお荷物な方策だよ。
442デフォルトの名無しさん:2006/03/09(木) 00:44:55
今の時代ビット演算の需要は
べらぼうに速いフラグ判定くらいじゃね?
のみ、いずれか、等価あたりはifでやるより個人的には簡単だし
443デフォルトの名無しさん:2006/03/09(木) 00:58:00
>>440
ぷえ乙
444デフォルトの名無しさん:2006/03/09(木) 01:06:50
フラグ判定以外にも需要ありまくりだろう
例えばビット演算全く使わないと
映像音関係ぜんぶウンコになると思う。
445デフォルトの名無しさん:2006/03/09(木) 09:31:20
>>437
nand, norは万能
446デフォルトの名無しさん:2006/03/10(金) 15:00:39
ビット演算を使わない人間は住んでる世界がそれで十分か
損をしてるかのどちらか。とはいえxorでの交換はお勧め
できない
447デフォルトの名無しさん:2006/03/10(金) 15:15:54
メモリの中で低位アドレスからみて最初にビットの立ってる位置(アドレス,ビット番号)を
最速で検索するのはどうすればいいですか?
448デフォルトの名無しさん:2006/03/10(金) 18:25:24
アドレスは、ループで地道に探せ。
ビット位置は、見つけた数をaとするなら
(a and (a - 1)) xor a
で最下位ビットを得ろ。
ビット位置を得る具体的な方法は、このスレ内を検索しろ。
お団子が色々提案してる
449デフォルトの名無しさん:2006/03/10(金) 18:29:13
xorでの交換は、指定したビット位置だけ交換出来るのがメリット

これを組み合わせて、ビット単位に前回と比べて変化があったビットだけ採用するような事が簡単に出来る
450デフォルトの名無しさん:2006/03/10(金) 18:34:34
団子マダー?
451・∀・)っ-●○◎- ◆Pu/ODYSSEY :2006/03/10(金) 18:42:45
うはwwww
JPEGでバイト飽和演算つかいまくりんぐwwww
452デフォルトの名無しさん:2006/03/10(金) 19:01:52
団子は提案してるだけで試してないから駄目
453・∀・)っ-●○◎- ◆Pu/ODYSSEY :2006/03/10(金) 19:02:49
なんだと><

いまx64環境使えるんだけどなんか試してほしいものある?
454デフォルトの名無しさん:2006/03/10(金) 20:13:06
>>453
試しに回線切って首吊ってみてくれ。
455デフォルトの名無しさん:2006/03/10(金) 20:34:15
>>454
それだと結果が得られないからどうせなら実況中継してもらったほうがよくはないか?
456・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/10(金) 23:14:06
>>454 だが断る><

>>455 それなんてエロゲ?
457デフォルトの名無しさん:2006/03/10(金) 23:44:47
って言いたいだけちゃうんかこの45歳
458・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/10(金) 23:47:03
なにその俺のほぼ倍の年齢><
459デフォルトの名無しさん:2006/03/11(土) 00:06:15
Ω<ナッナンダッテー
460デフォルトの名無しさん:2006/03/11(土) 00:09:02
>>458
俺と同じか少し下くらいだったのか。意外。
461デフォルトの名無しさん:2006/03/11(土) 00:23:30
学生かよ
462・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/11(土) 00:28:14
ルーキーだ><
1982年生舐めんなよ><
463デフォルトの名無しさん:2006/03/11(土) 00:53:35
>>462
工エエェェ(´д`)ェェエエ工工
464デフォルトの名無しさん:2006/03/11(土) 01:03:28
俺はタメか一個下からビット演算についていろいろ教わってたのか…
465デフォルトの名無しさん:2006/03/11(土) 01:10:04
ドカタの俺に院卒のSEはいろいろ教えを請いに来るよ
相手が詳しければ年上、年下なんてどうだっていいこと
466デフォルトの名無しさん:2006/03/11(土) 01:13:24
>>465同意。

まあ、小学生とかだとショックだけどな。
20いってりゃ特定分野の知識は年令関係ないでしょ。
467・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/11(土) 01:15:07
登大遊はすげーと思うよ><
学生ニートやってたときに彼の本にずいぶんお世話になった(彼は当時高校生
468デフォルトの名無しさん:2006/03/11(土) 03:16:16
>学生ニート

頭痛が痛くない
469デフォルトの名無しさん:2006/03/11(土) 11:04:43
おい、団子はハッカーの楽しみの内容の何割りを理解できてるんだ?
470デフォルトの名無しさん:2006/03/11(土) 17:20:37
>>465
知識範囲が狭い事は判明しているので20代は納得。
471・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/11(土) 18:07:19
>>468
定数テーブル参照を1ビットマシンでビット演算だけで実現するくらいかな。





逆に30代以上なんて退役じゃんwww
脳みその老化には逆らえんだろ

でも2ちゃんねらーって統計によれば30〜40台が一番多いらしいね。道理でリアルニートが(ry
472デフォルトの名無しさん:2006/03/11(土) 18:33:04
>>465
つーか、30代以降なら見識を疑う。
473デフォルトの名無しさん:2006/03/11(土) 18:34:09
>>471
>学生ニート
要は、「引き篭もり学生」か?
474デフォルトの名無しさん:2006/03/11(土) 19:08:44
流行りの言葉使ってみたくなる年頃なんだろ
475デフォルトの名無しさん:2006/03/11(土) 21:28:19
ネット初心者ってそういうの好きだからね
476・∀・)っ-○●◎- ◆Pu/ODYSSEY :2006/03/11(土) 21:34:32
30代が釣れたwwww
477デフォルトの名無しさん:2006/03/11(土) 21:47:42
>>476の人気に嫉妬
478デフォルトの名無しさん:2006/03/12(日) 12:12:07
40代かもしれんのに「釣れた」ってwww
479デフォルトの名無しさん:2006/03/14(火) 01:04:13
>>449
>xorでの交換は、指定したビット位置だけ交換出来るのがメリット
>これを組み合わせて、ビット単位に前回と比べて変化があったビットだけ採用するような事が簡単に出来る

「指定したビット位置だけ交換」を組み合わせて
前回と比べて変化があったビットだけを採用する...
ようなことを簡単にやるにはどうすれば良いのだろう。

おしえてくだちい
480デフォルトの名無しさん:2006/03/14(火) 06:48:49
>>479
このばあいの 「これ」 はタイトルの ビット演算の事だろう
481デフォルトの名無しさん:2006/03/17(金) 23:18:26
ビット演算だけでどこまでプログラムって作れるの?
あえて限界に挑戦した、みたいなサイトありませんか?
482デフォルトの名無しさん:2006/03/17(金) 23:40:49
>>481
FAとかで使うシーケンサは普通にAND,OR,NOTだけ(ラダー)でプログラミングしますがなにか?
483デフォルトの名無しさん:2006/03/18(土) 00:42:10
XORも出世したもんだな。
http://www.xbox-news.com/
484デフォルトの名無しさん:2006/03/18(土) 01:08:18
>>482
どうやって?どうやって?
485デフォルトの名無しさん:2006/03/18(土) 01:32:26
486デフォルトの名無しさん:2006/03/18(土) 01:36:18
>>484
ちょっと語弊があるかも知れないけどわかりやすく簡単に説明すると
シーケンサで扱うデータは(例外もあるけど)基本的に全部ブール値なのよ。
センサーやらボタンやらの入力もブール値(On/Off)だし、
シリンダーやコンベアを動かす出力もブール値(On/Off)。
で、制御はそれらの入力をAND,OR,NOTで加工したブール値を出力とすることで行うわけ。
実際のラダーのコードは↓こんな感じになります。

│ A    C                     D │
├┤├┬┤├─────────────○┤
│ B │                        │
├┤├┘                        │
│                             │

これで D = (A | B) & C; てな意味になります。
487http://www.vector.co.jp/soft/win95/util/se072729.html:2006/03/18(土) 19:01:46
TextSS のWindowsXP(Professional)64bit化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
488デフォルトの名無しさん:2006/03/19(日) 01:33:34
>>487
おまえあっちこっちに貼ってるな
489デフォルトの名無しさん:2006/03/19(日) 03:29:49
>>487
返事書いといただろ
ちゃんと読めよ
490デフォルトの名無しさん:2006/03/19(日) 07:15:24
小学生の頃は初歩的なビット演算とか楽しくチャレンジ出来たのにな〜・・
今は退屈でコピペで済ましたくなるな・・
好奇心も老化するんだろーか・・w
491デフォルトの名無しさん:2006/03/25(土) 11:09:04
if( (0 <= a) && (a <= 10) )  と等価なコード

if( ((unsigned) a) <= 10 )

2の補数表現の負数をそのまま 符号無で評価すると、INT_MAXより大きくなる事を利用
492デフォルトの名無しさん:2006/03/25(土) 11:43:45
>>491
汗んブラ世代には至極当たり前田の事項だったりする

手元の gcc-3.4.4(-m86)ではどちらとも同じコードを吐くけど
つまるところ、

MIN <= a && a <= MAX

のコードが

(unsigned)(a - MIN) <= (unsigned)(MAX - MIN)

に変形されるので、条件比較分岐が減る罠
493デフォルトの名無しさん:2006/03/26(日) 10:17:34
>>481
ハード的にはビット演算しかないわけだが。
494デフォルトの名無しさん:2006/03/26(日) 21:41:45
>>493
まさか、NOT、NAND、NORゲートだとか言い出さないだろうな?
495デフォルトの名無しさん:2006/03/26(日) 23:05:31
まあ、>>493は、20年くらい過去から書き込みしてるらしいから、いいんでね?
496デフォルトの名無しさん:2006/03/27(月) 00:30:17
まあ、>>495は多値演算バリバリだからい(ry
497デフォルトの名無しさん:2006/03/27(月) 08:41:52

if( (n-1) & n ) { ,,, }

nが0または 2^xで表現出来る時 のみ実行される

たとえば入力ポートのどれか1つがonであると判ってる時に
多重押しになってないかのチェックに使える
498デフォルトの名無しさん:2006/03/27(月) 09:32:55
a<=b
ならば
a<=x<=b <=> (unsigned)(x-a)<=b-a
499デフォルトの名無しさん:2006/03/27(月) 09:42:52
× nが0または 2^xで表現出来る時 のみ実行される
○ nが0または 2^xで表現出来ない時のみ実行される
500デフォルトの名無しさん:2006/03/27(月) 09:55:06
500
501デフォルトの名無しさん:2006/03/27(月) 11:08:15
>>494
他に何があるのか。
502デフォルトの名無しさん:2006/03/27(月) 17:01:04
まあそれを言ったら終わりだろ。
この3つの論理回路で全てが構成されてるのは明らかなんだし。
503デフォルトの名無しさん:2006/03/27(月) 17:05:33
つ[ff]
504デフォルトの名無しさん:2006/03/27(月) 17:51:24
>>503
つ[等価回路]
505デフォルトの名無しさん:2006/03/27(月) 18:34:22
>>503
フリップフロップだって、結局NAND、NOR、NOTの組み合わせのような気がするなあ。
単純なRS-FFとかNAND 2個で出来るし。
506デフォルトの名無しさん:2006/03/27(月) 19:25:45
それを言ったら、NORもNOTもNANDがあればできる。
#つーか、TTLの基本はNANDゲートだ。
507デフォルトの名無しさん:2006/03/27(月) 19:37:04
NANDゲートで全て表現できるとしても、普通NOT、NORゲートは別に作るんじゃねー?
508デフォルトの名無しさん:2006/03/27(月) 20:07:36
>>506
ECLだとNORが基本だがな
509デフォルトの名無しさん:2006/03/27(月) 20:22:01
質問
何故に回路(TTLとか)は負論理が多いんですかね?
510デフォルトの名無しさん:2006/03/27(月) 21:49:37
>>509
ヒント:電子の移動度
511デフォルトの名無しさん:2006/03/27(月) 22:27:45
>>509 トランジスタは反転回路だから
512デフォルトの名無しさん:2006/03/27(月) 22:47:13
でも普通、全部が負論理じゃなくて、正論理の部分も何故か存在してるんだよなー
513デフォルトの名無しさん:2006/03/28(火) 06:49:33
>>512
たとえば何よ
514デフォルトの名無しさん:2006/03/28(火) 11:00:51
>>513
アドレス/データバスは普通、正論理。

>>509
TTL は特にそうなんだけど、スレッショルドがLレベルに近いから
Hアクティブな信号線はノイズに弱くなる。
515デフォルトの名無しさん:2006/03/28(火) 12:05:04
>>514
H68TRは負論理でちょっと泣いた事ある。
ちぇー
516デフォルトの名無しさん:2006/03/28(火) 12:14:13
あと TTL は NPN (2SCタイプ) なので、出力は トランジスタ ON で L
Hは抵抗でプルアップという事になるから
Lの時はその抵抗にムダに電流を流す事になり、

消費電流を減らすには 普段をH 出力にしておいた方が都合が良いというのもあるかもね
517デフォルトの名無しさん:2006/03/28(火) 12:55:51
ICチップの仕様でプルアップにするのかも知れんが逆ならプルダウンさせるわけで、
プルアップもプルダウンも抵抗に電気を流すので多ければそれだけ消費電力UPするような
518デフォルトの名無しさん:2006/03/28(火) 13:03:27
TTLは入力がオープンだとHになるからなんじゃ?
CMOSなら不定だけど。
519デフォルトの名無しさん:2006/04/09(日) 14:56:24
age
520デフォルトの名無しさん:2006/04/15(土) 19:39:27
age
521デフォルトの名無しさん:2006/04/15(土) 20:34:19
面白い話題は無いのか?
522デフォルトの名無しさん:2006/04/15(土) 23:37:43
          _,l;;;;;;;;;;;;;;;;;;;;;;;;;;;l,,_
        ,.r'´,.    -┐   ':..,゙ヽ
       ,r' ,::;:'    ,ノ ヽ、    ゙:::.ヽ
      ,.' _.,:;:'___ _立_  ___;;ミ゙、          ̄ノ ̄| ̄
     .l厄巳厄巳厄 i王i ,.巳厄巳厄巳l           ,勹 .├‐''
     l´ , "´  ̄ ̄ ̄ `'''′  ̄ ̄ ̄`.:`{         ´_フ  ヽ、_,
     | l ;;:.,.   ::、.       ...   '゙|
    ,.-''、.,! ,.::'    ヽ、:.゙、 ;;.:' ''  ヽ | ,.、       __l__
   ./  、/ `ヾー─tッ−ヽ''  kーtr─ツ'´〕. ヽ.        |
  / {´i Y::::..   ` ̄ ̄´.: "i! ::. 、` ̄´ ゙:::.、} r、 l        i,____
  | ヾ_,,入;:::.. `'' " ´.::; .::i! ::..  ```  :. }ツl l
  \  ノ ヾ ;:::.   .:r'' :: ll! :ヽ;:..:.   .: j,ノ ,!       ┬‐┌,┴┐
    ヽ',,;l  ゙i ;::.. _ `ヽ、;;,,,,'.ィ'' _,, .::,;r'1,,,/           l__ ノl士
  ッジ::::::|  ゙ ,r'´:::;;;;;;;::>  弋´;;;;;::::ヽ'" |:::::゙'イィ      ノ凵  l土
 弍:::::::::::l  /:::;r'´ ,,..-ー…ー-、 ヾ;:::'、  |:::::::::::ヒ
  シ:::::::::::l   i':::,!  ´  __  ゙  l::::l:. |::::::::::ス       __ヽ__‐┬┐
  彡;:;:::::l  l:::l     ''''''''⇒;;;:,   l:::l  |::::;;ャ`        ニ メ ,ノ
  ,r', 广'`ヽl:::l ::::. .::     ゙::.   l::l ノ^i`、         l ̄l ハヽヽ
 ,イ(:::j    i::;ヘ  :;:.       .::   l::l'"  l:ヽヽ         ̄   ̄
 |;:ヽヽ   l::l  ヽ ;:.... ..  .. :  /l::l   ノ ,.イ
 |;:;:;:;\\ l::l   ', :;.:;::::::::::..::.  /  l::l,r'' /;:;:;|
523デフォルトの名無しさん:2006/04/19(水) 21:48:07
     ♪    /.i   /.i  /.i
   ♪     ∠__ノ ∠__ノ ∠__ノ   エーライヤッチャ
        〈,(・∀・;)ノ・∀・;)ノ・∀・;)ノ     エーライヤッチャ
         └i===|┘i===|┘.i===|┘        ヨイヨイヨイヨイ
           〈__〈 〈__〈 〈__〈
524デフォルトの名無しさん:2006/04/20(木) 02:45:34
armは割り算がないとか。
問題:割り算をビト演算で書け。
525デフォルトの名無しさん:2006/04/20(木) 07:15:41
ビット演算+シフト?

加減算とシフト命令を使って書くのは出来るが、ビット演算はキツイなあ
526デフォルトの名無しさん:2006/04/20(木) 12:12:18
ビット演算で加減算書けるだろ
527デフォルトの名無しさん:2006/04/20(木) 14:20:30
キツイと言ってるだけで、出来ないとは言ってないよ
加算は
c+a+b
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0 c
1 0 0 1
1 0 1 0 c
1 1 0 0 c
1 1 1 1 c

だからxor と or とシフトでは何度か繰り返さないといけないからなあ
528・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/21(金) 02:52:14
演算によっては、SIMDレジスタ駆使して1bit×64並列とかやったほうが
スループット稼げることもあるから覚えておいて損は茄子
529デフォルトの名無しさん:2006/04/21(金) 03:03:33
ぁなたゎVIPPERですヵ?
530デフォルトの名無しさん:2006/04/21(金) 04:59:26
Yes! I'm VIPPER!
531デフォルトの名無しさん:2006/04/21(金) 07:27:39
ぁなたゎニートですか?
532デフォルトの名無しさん:2006/04/21(金) 07:51:51
論理演算で書いた加算はこんなふうになる。 だからSIMDは巧く使えないと思うのだけど?

function add(a,b:Integer):Integer;
var c:Integer;
begin
repeat
c:=(a and b);
a:=a xor b;
b:=c shl 1;
until b=0;
Result:=a;
end;
533デフォルトの名無しさん:2006/04/21(金) 08:02:21
full adderか。
534デフォルトの名無しさん:2006/04/21(金) 14:19:01
NG指定してるので気づかなかったが
奴さんは全然関係ない独り言を唐突に書き込んだだけだから
相手しなくていい
535デフォルトの名無しさん:2006/04/21(金) 14:57:57
シフトも使わずに >>481 実現しようとしたら面倒すぎて挫折した…

>>534
ああ、なんでいきなり SIMD とか言い出したのかと思ったら
言い出したのはあいつか。やれやれだぜ。
536デフォルトの名無しさん:2006/04/21(金) 17:02:39 BE:552842069-
>>534-535低脳ジエン乙wwww
537/:2006/04/21(金) 18:04:18 BE:153567353-
>>532
いや、それでOK。

たとえばAltiVecで128個の3bitデータを(1bit×128)×3本レジスタに
転置したデータの加算はこれで実現できる。

; dataA : v0, v1, v2
; dataB : v3, v4, v5
; result : v6, v7, v8
vand v31, v0, v3
vxor v6, v0, v3
vxor v30, v1, v4
vand v29, v1, v4
vxor v7, v30, v31
vxor v31, v30, v31
vor v31, v30, v31
vxor v8, v2, v5
vxor v8, v8, v31

AltiVecやSSE2で扱えるのはせいぜい16個のデータまでだから
算術演算は微妙だが、桁上げの無い論理演算主体のコードならスループットは十分稼げる。
DESやAESにあるような複雑なビット転置にかかるコストも軽い(この場合ECBにしか使えないが)
538\:2006/04/21(金) 18:06:58 BE:245707946-
補足。
転置マトリクスをどうやって作るかなんてのは野暮だから辞めてくれな。
スループットの向上が転置のコストに勝るという前提の話。
539・∀・)っ-@{}@{}@{} ◆DANGO/KW4s :2006/04/21(金) 18:40:35 BE:644981797-
言うの忘れたけど、相変わらず馬鹿ニートが平日昼間っから寒い発言してるな
4月から有給なんてあり得ないからwww
現実で無能の烙印押された人間が2chなら居場所あるとでも思ったかケケケ
540・∀・)っ-@{}@{}@{} ◆PoizonIkwU :2006/04/21(金) 18:44:28 BE:245707564-
言うの忘れてなかったわ。Beログインしてたんで同一人物の証明にはなるだろうwww
541535:2006/04/21(金) 18:56:54
>>536
自演じゃないですよ。
自演に見えたんですか?間抜けですね。
542デフォルトの名無しさん:2006/04/21(金) 19:06:01
何このシシカバーブスレ。
543デフォルトの名無しさん:2006/04/21(金) 19:18:57
馬鹿を相手にするのもまた馬鹿
544デフォルトの名無しさん:2006/04/21(金) 20:37:24
>>539
俺の職場、4月が最も稼働率が低いんだが。
年度始めって仕事少なくない?
545・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/21(金) 21:42:57
勤務中のネットの私的利用も規制されてない時点で少なくとも大手はあり得ない。
単純に会社の営業力弱くて大手に相手にされてないだけだろwwww
546デフォルトの名無しさん:2006/04/21(金) 21:52:15
研修中にケータイからなんて俺以外にやっちゃダメ!
547デフォルトの名無しさん:2006/04/21(金) 22:39:30
うちのサイトのアクセスログみると
大手から勤務時間中に大量に来てるわけだが
548デフォルトの名無しさん:2006/04/21(金) 23:34:14
うちも、アクセスログでSONY, 東芝、富士通、NEC、日立なんかからのはスゲーアクセス量だ
549デフォルトの名無しさん:2006/04/21(金) 23:37:46
ニートの屑サイトでもgeetkeeper, Panasonicとかからアクセスがある
550デフォルトの名無しさん:2006/04/21(金) 23:47:05
俺のところも。
gatekeeper10.sony.co.jpとか。
今日の午前中。
「検索キーワード指定で来てるのでロボットじゃなさそう。
551デフォルトの名無しさん:2006/04/21(金) 23:55:45
 ふとした瞬間に 視線がぶつかる
 幸運(シアワセ)のときめき 覚えているでしょ
 パステルカラーの季節に恋した
 あの日のように 輝いてる あなたでいてね

 負けないで もう少し
 最後まで 走り抜けて
 どんなに 離れてても
 心は そばにいるわ
 追いかけて 遥かな夢を

 何が起きたって ヘッチャラな顔して
 どうにかなるサと おどけてみせるの
 “今宵は私(ワタクシ)と一緒に踊りましょ”
 今も そんなあなたが好きよ 忘れないで
552・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/21(金) 23:57:09
そーいや折れんとこの基地外サイトにもどういうわけか米AMDからアクセスあったなwwwwwwwあれはワロタ
553デフォルトの名無しさん:2006/04/22(土) 00:02:39
どっかの記事で、
仕事中に個人メールや仕事外のサイトを訪れる社員は8割とかいう記事見たっけな
(8割はあいまい。7割、もしくは9割だったかも)
554デフォルトの名無しさん:2006/04/22(土) 00:20:01
>>552
アクセス規制されてる大手って、具体的にどこ?
555デフォルトの名無しさん:2006/04/22(土) 00:38:35
団子をいじめないで!><
556・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 00:40:16
ヒント:●蔵●杉
基本的に参照できるのはWAN内のコンテンツだけ。microsoftだけに限ってブロックされてない。
557デフォルトの名無しさん:2006/04/22(土) 00:46:31
●蔵●杉?
558デフォルトの名無しさん:2006/04/22(土) 00:51:07
アクセス規制されてるところってあるんだねー。とても信じられねーよ。
今時それやっちゃうと
取引先のサイトとか会員制や非公開のBBS、
技術資料検索なんかに多大な不都合を起こすだろうに。
お役所ぐらいかと思ってたよ。
まあそんな会社は早晩衰退していっちゃうだろうさ。
559デフォルトの名無しさん:2006/04/22(土) 00:53:49
WAN内コンテンツって何だ(w
560デフォルトの名無しさん:2006/04/22(土) 00:55:12
>>559
おいおい、そんなのは何処の会社でだってあるだろが。
お前、会社勤めじゃないだろ?
561デフォルトの名無しさん:2006/04/22(土) 01:01:24
●蔵●杉・・・大手・・・?
●蔵●杉?
●蔵●杉?
●蔵●杉?




大蔵省!??
562・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 01:03:45
>>559 イーサーネット
必要な資料は全部WAN内にミラーリングされてるし、外部サイトはかろうじて
msdn.microsoft.comは読めたんで仕事には困らなかったけど何か?

仕事に関係ない外部掲示板に書き込み放題の某GKなんかのほうがおかしいだろ。

>>561 大ヒント:最寄駅名 すまんこれ以上は無理
563デフォルトの名無しさん:2006/04/22(土) 01:05:21
そのWANの使い方はよくわからん。
おいらは、LANと対比して「インターネット側」と認識していたが。
ひょっとして、支社内LANとの対比で「本社側」という意味のWANもありなのか?
564デフォルトの名無しさん:2006/04/22(土) 01:06:41
団子のあおり耐性について
565デフォルトの名無しさん:2006/04/22(土) 01:08:00
団子をいじめないで!><
566デフォルトの名無しさん:2006/04/22(土) 01:08:34
武蔵小杉か。あそこには何があったっけな。中原ならアレだけど。
567デフォルトの名無しさん:2006/04/22(土) 01:11:33
内の会社は申請しないとネットができん。
申請してもそれなりの理由がないといけない。
そんなわけでネットすらつなげれん。

とりあえず、イントラとメールはできるが、外部につないで調べ物もできん。
一応ソフト会社なのに・・・

まあ、糞みたいな会社だからね・・・
Nなんて
Sすてきな
Dだめ会社
568デフォルトの名無しさん:2006/04/22(土) 01:13:53
Nなんて
Eいー
Cかいしゃ?
569デフォルトの名無しさん:2006/04/22(土) 01:15:05
>>567
管理営業部門?
研究開発部門でネットから締め出し喰らっちゃ今時手かせ足かせ状態になるなあ
570デフォルトの名無しさん:2006/04/22(土) 01:20:19

           r'丁´ ̄ ̄ ̄ ̄`7¬‐,-、           /
        r'| |          |  |/  >、     /
        ! | |          |  |レ'´/|       |   待 て
        | | |   /\   |  |l  /⊂う    |
        | | |__∠∠ヽ_\ |  リ /  j     ヽ   あ わ て る な
        |´ ̄   O   ̄ ̄ ̄ ̄ ̄`!      〉
        l'"´ ̄ ̄ヾ'"´ ̄ ̄`ヾ::幵ー{       /   こ れ は 団 子 の 罠 だ
        ⊥,,,,,_、    ___,,,,,ヾ| l::::::|      |
         lヾ´ f}`7   ヘ´fj ̄フ  | l::i'⌒i    |   
         l ,.ゝ‐イ    `‐=ニ、i | l´ ( }    ヽ
         l     {         U | l 、_ノ    ∠ヘ
        l   / ̄  ''ヽ、   | l ヽ_       \,_________
           !  ハ´ ̄ ̄ ̄`ト、  |亅〃/\
        ,人 f ´ ̄ ̄ ̄``ヾ  j ,!// {_っ )、
      // `ト、__iiiii______,レ'‐'//  _,/ /スァ-、
    ,.イl{ { 々 !/´しllllト、 ̄`ヽ、 // /´,.-、 /彑ゝ-{スァ-、
  ,.イ彑l l > ゞ く l 〃 l|ハ.lヽ、 ハVゝヽ二ノ/ゝ-{、彑ゝ-{、彑ァ-、
,.イ彑ゝ-'l l ( (,) レシ′   !l `ソァ'´    _ノ7{、彑ゝ-{、彑ゝ-{、彑{
ュゝ-{、彑l l  ` -イヘ      !l // /⌒ヽヾ/_ゝ-{、彑ゝ-{、彑ゝ-{、
 {、彑ゝ-'l l f⌒Yハ ',    !l/ / ヽ_う ノ /-{、彑ゝ-{、彑ゝ-{、彑ゝ
彑ゝ-{、彑l l{ に!小 ヽ   /!l /   ,/ /彑ゝ-{、彑ゝ-{、彑ゝ-{、
571デフォルトの名無しさん:2006/04/22(土) 01:56:11
ぷえ新卒1年目で3社目かい?
572・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 02:56:06
並べ替えて杉村大蔵かもしれんよ
573デフォルトの名無しさん:2006/04/22(土) 03:15:17
東横線とか南武線みたいなローカル線しか通らない武蔵小杉みたいなド田舎に NEC みたいな大手があるわけないだろう

あと GK 連中はマじゃないからな
連中のいる会社の頭にはSさえつかない可能性も高いぞ
なのに同じ目でみられるんだよなぁ・・・
574デフォルトの名無しさん:2006/04/22(土) 03:30:20
>>573
常識的に、オフィスは営業拠点だけじゃないでしょ。
575・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 03:57:02
>>573
ん?あのデカいツインタワーはどこの会社のビルだろうな?www
576デフォルトの名無しさん:2006/04/22(土) 04:17:48
>>575
今そんなんできてんのか? そういや工事してたな
あのへんでツインタワーってったら新川崎じゃないのか?
577デフォルトの名無しさん:2006/04/22(土) 04:22:25
連投すまんが、>>574 皮肉の通じない奴だな
むかいがわらだっけか? 専用改札のあるのは
578デフォルトの名無しさん:2006/04/22(土) 04:34:10
どこの会社でもいいがつまらん奴もいるもんだな
579デフォルトの名無しさん:2006/04/22(土) 05:08:58
ま、そういう事。
580デフォルトの名無しさん:2006/04/22(土) 08:19:15
>>532の減算版

function sub(a,b:Integer):Integer;//a-b
var c:Integer;
begin
repeat
c:=((not a) and b);
a:=a xor b;
b:=c shl 1;
until b=0;
Result:=a;
end;

加算を利用する場合
function sub(a,b:Integer):Integer;//a-b
begin
result:=add(add(a,not b),1);
end;
581デフォルトの名無しさん:2006/04/22(土) 10:15:54
団子って、痛いな、痛すぎる。
実生活でよほど人から認められてないんだな。
582デフォルトの名無しさん:2006/04/22(土) 10:23:22
そんなに攻めるなよ
許せないおまえらも十分キモイYo!
583デフォルトの名無しさん:2006/04/22(土) 10:27:08
適当な数値から任意の位置の4bitの数値を取り出したいんだけどどうしたらいい?
584デフォルトの名無しさん:2006/04/22(土) 10:32:20
連続した4ビットなら

c 言語なら (x >> bitpos) &( (1<<4)-1)
delphiなら (x shr bitPos) and ( (1 shl 4) -1)
585デフォルトの名無しさん:2006/04/22(土) 10:35:25
>>584
ありがと、試してみる。
586デフォルトの名無しさん:2006/04/22(土) 10:55:31
>>563
>そのWANの使い方はよくわからん。
つか、「WAN内コンテンツって何だ」って訊かれて
物理層I/Fを答える莫迦も、そうそういないけどな。
いつのまにか
>勤務中のネットの私的利用も規制されてない時点で少なくとも大手はあり得ない。
この主張はウヤムヤになってるし。
587デフォルトの名無しさん:2006/04/22(土) 11:34:35
>>586
団子「WAN内コンテンツ」
団子「勤務中のネットの私的利用も規制されてない時点で少なくとも大手はあり得ない」
他人「そのWANの使い方はよくわからん。」
団子「インターネット」

別にコンテンツが何かを意味してるんじゃなく、「WAN内の」ってところにひっかかりが
あるわけで、「WAN内のコンテンツ」だと「普通にインターネットのコンテンツのことじゃん」
って自分で気づいて自嘲したものだと思うな。
俺なら、「インターネット(^^:)」とか明らかに自嘲したようなリアクションで答えるところだけど。
まあこんなところも嫌われる性格がにじみ出たんだろうな。

確かに間違った使い方かもしれんが、会社規模が大きく、クラスCで納まらないほど
広域(全世界的)に広がったイントラネットだとLANというよりWANと言った方が
しっくりくるかもしれんけど、それならきちんと謝ってから訂正しろよ、なあ。
588・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 13:11:09
VPN網だね、アレは。メチャクチャ広帯域。
数GBのファイル転送が数分で終わる。

うちの知り合いが通い詰めてる会社は、URLに bbs とか 2ch が入ってるだけで
閲覧自体できないらしい。それくらいやっても当然とは思うがな。
まぁ、BBSも見ればたまに役に立つことも在るかもしれんにしても、GETやHEADを
許すまではアリにしてもPOSTは弾くのが当然でしょ。

自宅に串立てて自宅のIPの足しかつかないようにすれば文句も言えまいて。
まぁ、私的利用をそこまでして必死に申し出る香具師もどうかと思うけどな。
589デフォルトの名無しさん:2006/04/22(土) 14:22:18
>>588
「当然」と「思う」のは勝手だがな。
590・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 14:58:43
独自ドメインもとってない中小無名企業なら2chみたいな掲示板に足跡つけらてても大して痛くないかもしれんが
大きな会社だとそうもならんと思うのよ。
591デフォルトの名無しさん:2006/04/22(土) 15:04:52
>>590
たとえばこんなの?

GateKeeper**.Sony.CO.JP
592kobekeeper.mhi.co.jp:2006/04/22(土) 15:13:53
俺、釣られてる?
593デフォルトの名無しさん:2006/04/22(土) 15:16:42
なんて反省のカケラもない奴だ。
ここまで厚顔無恥だと無視するしか手は残ってないな。
594デフォルトの名無しさん:2006/04/22(土) 15:21:50
とりあえず俺の隣にこんな奴がいない幸せを噛み締めてる
595デフォルトの名無しさん:2006/04/22(土) 15:26:45
しっかし、団子っていつもいつも叩かれまくってるってのによくもまあ現れるもんだね。
何考えてるんだろ。マゾかな?
596・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 15:27:27
>>592 ETC作ってる?

>>593 何を詫びる必要があるのかサッパリ。名無しで書き込んでる人にに下げる頭はないっすよ正直。
世間の影響力の小さい会社や働いてない人だと、堂々と平日日中に2chでカキコできていいよね、って話。
597デフォルトの名無しさん:2006/04/22(土) 15:27:36
それはVIPPERだからさ
598・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 15:32:27
>>594
なんかこんなソフト作ったとか実績のある人間にそのハンドルネームでも付けて意見されたら
へこむけど、名無しで攻撃するのは基本的になんたらの遠吠えに等しいからね。
実際実績皆無なんだろうけど。
599デフォルトの名無しさん:2006/04/22(土) 15:33:05
>>591
漏れのどう考えても仕事に役立ちそうに内部ログにも来てるよ、それ。
ほかにも曰立とか講壇社とか花押とか。
600デフォルトの名無しさん:2006/04/22(土) 15:35:30
>>598
本当に実力のある者はHNなんてくだらないものつけない
601デフォルトの名無しさん:2006/04/22(土) 15:36:37
つーか、そもそもHNなんて変な略語使わない。
602・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 15:37:52
HN持ってないオンラインソフト作家っているのか。へぇ。
603デフォルトの名無しさん:2006/04/22(土) 15:37:57
これでどうだ! 論理演算だけだと思うぞ
function unsigned_div(x,y:dword;var modu:dword):dword;
var a,b,c,v,w,lpc:dword;
begin
 a:=0;
 b:=0;
 lpc:=1;
  repeat
  a:=a shl 1;
  if (x and $80000000)<>0 then a := a or 1;
  x := x shl 1;
  b := b shl 1;
  w:=y;
  v:=a;
   repeat
   c:=((not v) and w);
   v:=v xor w;
   w:=c shl 1;
   until w=0;
   if (c and $80000000)=0 then begin
   b:= b or 1;
   a:= v;
   end;
   lpc:=lpc shl 1;
  until lpc=0;
   if @modu<>nil then modu:=a;
  result:=b;
end;
604デフォルトの名無しさん:2006/04/22(土) 15:46:32
まぁ確かに漏れはオンラインソフトはPN名義にしているからハンドルは内輪にしか使わないなぁ。
605デフォルトの名無しさん:2006/04/22(土) 15:49:04
まともな作者ほど口調や言い回しに気を使うものだ
606デフォルトの名無しさん:2006/04/22(土) 15:51:59
>>601
そもそも「ハンドルネーム」の時点で変。
(wiki には言い訳がましい理由が書いてあるが)
607デフォルトの名無しさん:2006/04/22(土) 15:56:15
高飛車な言い方もTPOをわきまえて使ってくれ。
この板じゃ初心者じゃなくて、フリー(じゃなくても)ソフト作家ばっかりが
集まってる(見てる)と思ってたら(ここに突っ込むなよ)
もう少し言い方を考えてみてもよいだろう?
他人をもっと尊重しようぜ。
608デフォルトの名無しさん:2006/04/22(土) 15:58:25
これで四則演算はビット演算(論理+シフト)だけで出来る事となった

次はビット演算だけによるループカウンタの効率的表現方法だな

一つのアイデアは M系列を使う事
609・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 16:01:05
へ?ハンドルとPNって普通同一じゃね?
PNとHNが別ってならそれでもいいけど

そのPNでも教えていただければ、発言に説得力あるわな。
逆に言えば名無しに成り下がってる時点で、そこらの能無しと同じ立場として発言してるってことじゃね?
610デフォルトの名無しさん:2006/04/22(土) 16:14:25
別に謝れとかは言わんけど、君が書き込むたびに騒動になるのは
なんか問題があるとは思わない?
同じソフトウェア仲間から総スカン喰って平気なの?
俺も当然webで公開してるけど、そんな挑発に乗って
ここで公開しようって気には全然ならないよ。
611デフォルトの名無しさん:2006/04/22(土) 16:21:12
トリッパー作ったくらいで天狗になるな
下を見る前に上を見ろ
612・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 16:25:43
>>607
ソフト作家ってのは自分自身の時間を使ってソフトの企画から設計・コーディングまで自分でやって
自分の名義でソフトを出してる人だと思ったが違ったかな。
客から、上からの指示ありきでせこせこコード書いて、その所有権を勤め先や会社に譲渡して、
それを対価にしてる職業プログラマはその範疇に入らないと思うけど。

両者には画家と塗り絵職人の違いがあるし。
見習いの情報学科の学生とかも含め、この板っての全てが作家やその卵ってわけじゃないのは
普通に考えればわかることだけど。

俺の小学校からの先輩が某有名オンラインソフトの開発メンバーだけど(今のとこ
唯一尊敬できる人)はこの板はそもそもレベル低すぎて見てないっていうし、そんなもんだと思う。
それに>>1にあるようにここ厨スレだしwww
613デフォルトの名無しさん:2006/04/22(土) 16:30:06
つまり「ここには挑発しに来てる」と公言しているわけですか?
そういうことならこっちは了解です。バイバイ。
614デフォルトの名無しさん:2006/04/22(土) 16:30:55
レベルが低いところで、どれだけ面白いことが出来るかを楽しんでるんだからさ。
>>537みたいにな 未完成品はちゃんと完成させろよ
615デフォルトの名無しさん:2006/04/22(土) 16:33:10
>>608
では早速M系列とやらの講義に入ってくれ。
616・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 16:36:10
「唯一尊敬」は言いすぎました。フリーソフトはいっぱい使わせてもらってます。
>>613ですが何か?
617・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 16:36:42
ごめん

>>517は俺ですが何か?
618・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 16:37:42
>>517,613  正直、本気で謝る。

>>537が俺
619デフォルトの名無しさん:2006/04/22(土) 16:38:10
ではお言葉に甘えまして。
まずは背景の説明を

>603 のコードではビット幅だけループする必要があるが、
ここでfor文を使ってしまうと、論理演算だけで実現した事にならない。
そこで、1をビット数だけ左シフトした時にオーバーフローしてゼロになる事を利用してループカウンタとしている

しかし、当然ビット幅を超える回数はこの方法では指定出来ない。

出来るだけ少ないビット演算でループカウンタが実装出来ないかというのが、現在の課題である
620デフォルトの名無しさん:2006/04/22(土) 16:38:13
いいえ何も。お引取りください。
621デフォルトの名無しさん:2006/04/22(土) 16:38:16
団子は秋葉原でコンデンサとか買ってきて論理回路作った経験は?
622デフォルトの名無しさん:2006/04/22(土) 16:39:47
>>618だから、未完成品は完成させろって。
623デフォルトの名無しさん:2006/04/22(土) 16:39:50
>>603
読めないからCで書いてくれませんか
624デフォルトの名無しさん:2006/04/22(土) 16:45:16
>>618
beがついてるんだから>>537が誰なのかは判ってる
何度もリンク先を間違うぐらい沸騰してるのか
そんなことじゃ、挑発してるというよりされてる方じゃないの?
625デフォルトの名無しさん:2006/04/22(土) 16:46:22
>>623
var ⇒ 参照渡し cならポインタ渡し
:= ⇒ =
dword ⇒ unsigned
$ ⇒ 0x
repeat 〜 until 条件⇒ do while(! 条件 )
result:= ⇒ return
626・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 16:48:54
>>622
その考え方を応用したソフトなら(どんな名義で出してるかはあえて言わないが)既に世に出てるよ。
627デフォルトの名無しさん:2006/04/22(土) 16:51:31
どうもです
if @modu<>nil then modu:=a;
これは
if (modu) *modu=a;
かな
Cと書き方逆っぽいけど
628デフォルトの名無しさん:2006/04/22(土) 17:01:20
>>627
そう。その通り。 @ はcの& 演算子相当。

 参照渡しだから単純代入になってる。
629604:2006/04/22(土) 17:04:53
>>609
ハンドルはあくまで只のハンドル。名前ではないのでハンドルネームなんて言葉は(本来)ない。
#つまり、チャットなどで便宜上使っているニックネームのようなものだな。

ペンネームはあくまで別名としての名前。書いたものを発表するために使っている名前だな。

漏れ自身はここではなんら議論に関与していないので、PNを公表する意義は見出せないな。
そういう意味では、無名化していると言う点では誰でもない。
630デフォルトの名無しさん:2006/04/22(土) 17:13:30
>>545
>勤務中のネットの私的利用も規制されてない時点で少なくとも大手はあり得ない。
                                          ~~~~~~~~~~~~
>>590
>大きな会社だとそうもならんと思うのよ。
                   ~~~~~~~~~~
631デフォルトの名無しさん:2006/04/22(土) 17:14:37
むかし、メモリが少なかった頃のVRAMが8bitやら16bitやらの時代のブレンド処理
332とか 555とかの(a+b)/2 をこんな方法で並列してやったような記憶もあるな。
632デフォルトの名無しさん:2006/04/22(土) 17:32:46
もはや、こういうのに興味があるのはdel厨だけか。
インラインアセンブラを組み込んでる言語だけあるな(^^
633・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 17:36:24
>>630
勤務中の2chへの書き込みが許されてる企業があるなんて知らなかったんだ。
視野が狭いのでごめんね。
634デフォルトの名無しさん:2006/04/22(土) 18:13:27
>>団子
VIPPERスレにいきましょうか?
635デフォルトの名無しさん:2006/04/22(土) 18:18:14
一つ言っておこう。
会社で与えられた業務だけをやってる奴は
こんな板にまでやって来ないもんだ。
ちょっと舞い上がってない?
636デフォルトの名無しさん:2006/04/22(土) 18:37:59
俺も思うところが一つある。
勤務中に2chに来るのを許してるところなんて無いだろうって思う。
それでもここにやって来るのは会社への帰属意識が低い甘ちゃんな奴だろう。
でも昼間アクセスするのが会社員だけではない。
アマチュアソフト作家の半分程度は学生だと思うし。
それを即ニート扱いは無いだろう。
またニートや引きこもりがここで喧嘩するとはとは思えん。
それほどの意気があったら社会に出てるって。
637デフォルトの名無しさん:2006/04/22(土) 18:42:06
どうでもいいですよ♪
638・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 18:44:29
>>629
Wikipediaに書いてあることの劣化コピーなんて求めてないから。このURL貼れば済むことでしょ。
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%83%8D%E3%83%BC%E3%83%A0
浴衣(ゆかた)が正しくは湯帷子(ゆかたびら)だとかいちいち文句つける人ですか?

うちはご覧の通りコテハンとペンネームの区別がない人間なんで(というかコテハン名義で
作品作ってきた人間なんで)その手の揚げ足取りとられても、はい、覚えておきます、
って答えるほかないです。
そういうやり方で自分の作品(ソフト・イラスト・etc..)の一部または全部を公開してる人と
長く馴れ合ってたから感覚ズレてるかもしれんけど。

自分が話題に関与してないって解ってるのに引きずる理由は理解できん。
ちなみに、あなたが何かのソフト作家だなんてあたしゃまったく信じてないし。
一言一句、なにもこたえるものもなく右から左に抜けていくだけです。
それなら吉野家や宇宙ヤバイコピペのほうがまだ印象に残るよ。

自分がクリエイターだって言いたいんならきちんとそれを証明すればいいだけの話だと思うのね。
「自分は本当は作家だけど正体は明かせない」・・・なんて虚勢にしか聞こえないんで
証明できないなら黙っておくほうが綺麗です。
2ちゃんねらーは虚言大好きだから、そういう風に思われても仕方ないってこと。
それを理解したうえで2chやってるんじゃないの違うの?

>>635
日中平気でサボる駄目社員っぷりを開き直られてもこまりますが><
639デフォルトの名無しさん:2006/04/22(土) 18:45:43
>>638
海外では本名で出す場合が多く思えるんだけどどうなの?
640デフォルトの名無しさん:2006/04/22(土) 18:47:44
よくわからんけど、研究をしてその結果を公開するような人は本名?
641デフォルトの名無しさん:2006/04/22(土) 18:52:35
>>638
>ソフト作家ってのは自分自身の時間を使ってソフトの企画から設計・コーディングまで自分でやって
>自分の名義でソフトを出してる人だと思ったが違ったかな。
これに対するレスだろ。ちゃんと反応しろよ。
642・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 19:02:54
普通に本名でやってるサイトも持ってるけど。
2ch関連かそれ以外かで線引きしてるつもり。
中の人自身のソフト開発の暇が削られすぎなんで、コテハン名義のソフト開発は
縮小していこうかなと思ってたりもする。

・∀・)っ-○●◎名義で出してるソフトはあって、それが俺の作品だって誰もがわかる。
「デフォルトの名無しさん」名乗っててもどんな作品作ってるかすらわからないし、
何も作品無い人かもしれない。そういう話。
643デフォルトの名無しさん:2006/04/22(土) 19:07:00
>客から、上からの指示ありきでせこせこコード書いて、その所有権を勤め先や会社に譲渡して、
>それを対価にしてる職業プログラマはその範疇に入らないと思うけど。
644デフォルトの名無しさん:2006/04/22(土) 19:10:09
(唯一)尊敬している人がいたなら、そういう人になりたいって思い
振る舞いなんかマネするものじゃないかな?
その尊敬する人から逆にどう見られてるのか気にしないものなのかね?
645デフォルトの名無しさん:2006/04/22(土) 19:12:48
>>644
いやきっとそれは知識量を尊敬してるのであって
きっと人品卑しからない人って訳じゃないんだろうて(w
646 ◆0uxK91AxII :2006/04/22(土) 19:19:22
長期間、所謂コテハンで書いていれば、
名無しに対してそういうstanceになるのは、ある意味当然だろうね。
とか書いてみるテスト。

コテハンというものは、情報に信頼性を付与する程度の物。
有益な情報を提供する時のみに用いれば、価値は上がるだろうね。
647デフォルトの名無しさん:2006/04/22(土) 19:29:28
>>642
ちょっとは考えてくれよ。
いくら名無しだとはいったってこの板にいるんだから何らかの作品を提供してる人だって
結構いるだろうって推測ぐらいつくだろ?
自分に噛み付くその程度の低さを思ってそう言っているのかも知れないけれど
無頼者に対してはそれなりの態度で臨むものだよ。
自分のサイトを公表するかどうかってのは個々人のそれぞれのポリシーがあって隠している
わけなんだから挑発されたってコロコロ考えが変わるわけないじゃん。
逆にコロコロ考えを変える人は大したことはない人だよ。
648デフォルトの名無しさん:2006/04/22(土) 19:39:44
作品出してるか出してないかだけで技術を判断するのはおかしい
技術があっても既に作りたいものが世に出てれば作らないだろうし、
出しててもそれが本当に素晴らしいものなのかどうか
ソースコードに無駄は無いのか、バグ取りは完全か

てか、自分より技術が下のものを馬鹿にしてる時点で氏ねよと思う
649604=629:2006/04/22(土) 19:42:54
だからさ、面倒だから漏れはこのスレではソフト作家を騙る能無しでいいよ。
漏れがきちんと名乗りたいスレでは名乗るってだけの話だから。
650デフォルトの名無しさん:2006/04/22(土) 19:51:49
おいおい、ガラスのハートの壊れやすさ自慢大会会場かよ
651デフォルトの名無しさん:2006/04/22(土) 19:52:58
下のものに学ぶっていうことを覚えたらもっとしっかりした知識が身につくんだがなあ。
652デフォルトの名無しさん:2006/04/22(土) 19:54:01
>>650
おまいバカ?
653デフォルトの名無しさん:2006/04/22(土) 20:05:31
>>646
コテハンで検索してみても貴殿のサイトは発見できませんでした。
654デフォルトの名無しさん:2006/04/22(土) 20:11:10

まずはジョンソンカウンタ
これはbit幅の2倍の値がカウント出来る。

ジョンソンカウンタは シフトしながらMSBの反転をLSBに入れる事で実現出来る
655デフォルトの名無しさん:2006/04/22(土) 20:17:46

ジョンソンカウンタ方式による (N+1)*2 回のループの例

repeat
x:=( ( x shl 1) or (((not x shr N) ) and 1)) and ((2 shl N)-1);
until x=0;
656・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/22(土) 20:27:54
>>648
仕事以外ではプログラムやりません
先越されてるから、もっといいものがあるから、ソフト作りません
なんてのはプログラミングに対する愛がないんじゃね?

模倣からでも地道に始めてやがて独自性を開拓していく、それが技術立国ニッポン。
俺もパブリックドメインとかのコードをパクリマ・クリスティ。
657デフォルトの名無しさん:2006/04/22(土) 20:48:38
5年やって周りと同じレベルにならないのはダメ社員。
658デフォルトの名無しさん:2006/04/22(土) 21:56:28
おいおまいら!
タイトルを100回読もうな!
659デフォルトの名無しさん:2006/04/22(土) 22:28:10
単純シフト方式で 32bitのレジスタで32回
ジョンソンカウンタ方式で64回までループを回せるようになった。

しかし1万回とか100万回のループをどうやれば実現出来るのか

ジョンソンカウンタは MSBを単純に反転してMSBに入れたが
これをMSBと途中の複数のビットとの論理演算をしてLSBに返したらどうなるかを考える
こういう時の論理演算は xor

x:=( ( x shl 1) or ((( x shr 15) xor x ) and 1)) and $ffff
とすると 1から初めて1に戻るまでは255回 だいぶ改善された。


x:=( ( x shl 1) or ((( x shr 14) xor x ) and 1)) and $7fff;
これで x=1から開始して x=1に戻るまで 32767回かかる

こういうビットサイズ N で (2^N-1)の周期が出るのをM系列というらしい。
660デフォルトの名無しさん:2006/04/23(日) 00:09:05
> 勤務中の2chへの書き込みが許されてる企業があるなんて知らなかったんだ。

裁量勤務になれば会社の設備を使わないで2chへのアクセスは許可なんていらない。
国内大手だと優秀な奴から駄目な奴まで様々。むしろ不遇な境遇に居る優秀な人間が
出ていくから駄目な奴が多く感じるぐらいだな。そんな環境で生き残るには

> 大きな会社だとそうもならんと思うのよ。

みたいな社畜くさい発言しているようじゃ埋もれるだけだな。

> 仕事以外ではプログラムやりません

はいそれが?会社で面白そうなモノを選んで作れる立場にいますから。
もっともその立場になるには運と実力が必要。社畜には無理。
661デフォルトの名無しさん:2006/04/23(日) 00:24:37
裁量労働制じゃないところは殆どなかろうが、それでも大手は会社内に普通はいる
(サテライト勤務できるとこあるのかな)
施設内から2chは自由時間でもちょっとまずかろう
それに自由なテーマなんてそれほど選べないもんだし
大人数でシステム開発を行うことがほとんど
(でも意欲的なプロジェクトへの参加はありだね)
実力のある奴は先進的な面白い開発を行い、メンテをダメな奴に引き継いで
次から次へとプロジェクトを渡り歩くことが出来るが、そんなのは100人に1人ぐらいだ
662デフォルトの名無しさん:2006/04/23(日) 00:27:46
また、自分でプロジェクトを立ち上げることも可能なわけだが、
そういう立場だと実開発に携われないで管理業務に従事することになっちゃう
663デフォルトの名無しさん:2006/04/23(日) 00:33:05
>>661
> 実力のある奴は先進的な面白い開発を行い、メンテをダメな奴に引き継いで
> 次から次へとプロジェクトを渡り歩くことが出来るが、

実力だけじゃなかなか無理。強引に過去の仕事を切り離す意思が無いと引き継いだ
駄目な奴から変な依頼が来て潰れる。

> そんなのは100人に1人ぐらいだ

100人に1人ぐらいになれんでどうする?
部長だって100人に1人ぐらいじゃねーのか?
664デフォルトの名無しさん:2006/04/23(日) 00:37:17
部長は45才ぐらいじゃないとなれないし、課長だってプログラム組むことは有り得ない
ようするにプログラマーから管理者に転身しちゃうわけだ
いまのところまだまだ開発に従事したいと思ってる
665デフォルトの名無しさん:2006/04/23(日) 00:48:29
問題はそこなんだよね。漏れの給料だと自前で確保できる仕事じゃ回らなくなってくる。
そこで部下をつけて仕事をこなして稼いで来いって話になるわけだがそうなると当然、
管理に時間を取られるし管理能力が必要になるしで結局管理職になるのと変わらなくなる。
666デフォルトの名無しさん:2006/04/23(日) 00:50:38
俺は100人に1人にはなれそうもないな。
評価もSランクには到底なれないし。
情けないけど俺にはこれが現実だ。
667・∀・)っ-○●◎ ◆Pu/ODYSSEY :2006/04/23(日) 00:55:56
「デカイ企業」じゃないけど、生越ちゃんの会社なんかはそれこそ
Rubyの開発で国からも金もらってたりするし、好きなことやれてるってのは
まぁわかる。
てか、そういうレベルのプログラムを個人レベルででも作れるってのは理想。
そうなると、1から会社作ったほうがよくね?的な話に。

あと、研究所勤務とか?ああいうところこそ、それこそビット演算とかプリミティブなレベル
の作りこみできるわな。
ただアレは学位持ちのPDが大学や国研からダイレクトに企業にわたってくるもので
現場上がりにやれることなんて皆無だわな。
668デフォルトの名無しさん:2006/04/23(日) 01:01:02
> 部長は45才ぐらいじゃないとなれないし、課長だってプログラム組むことは有り得ない

100人の中の1人は無理じゃないって話のたとえ話はそういう方向に行くかな?

さすがに部長はコード書かんが最近はうちの会社では部署によっちゃ課長でもコード
書いていたりする。まぁ、課長職になってコード書けなくなった優秀なエンジニアが
退職するケースが増えていたのが原因かと思われるが・・・

> 情けないけど俺にはこれが現実だ。

努力はしろよ。自分が討ち死にしても次の若者がその道を引き続き開拓してくれれば
いいじゃないか。
669デフォルトの名無しさん:2006/04/23(日) 01:01:43
100人に1人のエースがこんなとこに来るはずないと俺は思う。
670デフォルトの名無しさん:2006/04/23(日) 01:03:19
俺は実力が100人に1人とは思っていない。なぜなら運も重要だからな。
671デフォルトの名無しさん:2006/04/23(日) 01:09:07
> それこそビット演算とかプリミティブなレベルの作りこみできるわな。

それは目的じゃなくて手段だからな・・・そういうのをやりたければ研究所だろうね。
672デフォルトの名無しさん:2006/04/23(日) 01:12:44
>>668
別にそれほど悲観してるわけじゃないよ。
一応同期の中じゃトップクラスだと自負してる。
(A評価で特別ボーナスも貰った経験はある)
673デフォルトの名無しさん:2006/04/23(日) 01:22:48
>>672
器用貧乏になるなよ。重要な事は周りに、
「マネジメントよりエンジニアやらせたほうが得だ」
と思わせる事だ。ただし組織が壊れるような事や閑職に追い込まれないように注意しろ。
674デフォルトの名無しさん:2006/04/23(日) 02:03:55
>>673
それは無理だって。
A評価だって普通に開発だけに従事してたら貰えっこない。
自分で目標設定して必要な人材(社内にリソースが足りない場合は社外からも)
集めて特許も何件か出してそれなりの成果をださないと。
675デフォルトの名無しさん:2006/04/23(日) 02:06:48
>>668
> 書いていたりする。まぁ、課長職になってコード書けなくなった優秀なエンジニアが
> 退職するケースが増えていたのが原因かと思われるが・・・

ちょっと気になったんだけど、プログラミングできる人は
ずっとプログラマであり続けたいと思う、ってこと?
676デフォルトの名無しさん:2006/04/23(日) 02:18:20
>>675
それは違う。
数年前から課長職だなんて無駄だという方向に会社の意識が向いてきてて
中間管理職を無くして、言わばプレーイングマネージャーとしてもっと活用しよう
ってことになってるだけ。
課長なんて役職はほとんど消えて、管理は部長にがんばってもらうというようになっている。
677デフォルトの名無しさん:2006/04/23(日) 07:25:28
LSB xor MSBで M系列になるビット数は 2,3,4,6,7,8 と小さい時は連続してあるが
大きくなると 15, 22,30,40  しかない。
またピッタリ16bit,32bitのM系列は作れない。

 x:=( ( x shl 1) or ((( x shr 14) xor x ) and 1)) and $7fff

上位ビットは、下位ビットがシフトされているだけなので
最後の and 命令を取り外してしまう。
 x:=( ( x shl 1) or ((( x shr 29) xor x ) and 1))

ループ回数を1万回とかの場合は、この演算を
1万回回した時の表を用意しておいて使う事になる

678デフォルトの名無しさん:2006/04/23(日) 09:28:11
いつからこのスレはマ板に移動されたんだ?
679デフォルトの名無しさん:2006/04/23(日) 09:40:19
ビット演算でする加算の桁上げ処理を減らす方法はないかな

調べると回路技術でも似たような問題があって キャリールックアヘッド というので解決してるそうだ
680デフォルトの名無しさん:2006/04/24(月) 13:31:32
>>679
おまいの使ってるCPUでは、キャリーフラグ立てるのに何か特別な命令を追加発行しなきゃならないのかね?
681デフォルトの名無しさん:2006/04/24(月) 13:51:39
普通は、キャリーフラグは 加減算と、シフト・回転だけだろうけど
このスレ的には加減算は禁止だから シフト・回転だな。

で、それが何か >>679の問題と関係するのかい?
682デフォルトの名無しさん:2006/04/24(月) 15:42:54
>>680 が何に噛み付いてるのか解らん。

>>679
キャリールックアヘッドは、キャリーの計算を並行してやっちまうという
手段なんで、ソフトであれやると (計算が面倒な分) 却って遅くなりそうな
気がしなくもないんで、いっそ表引きするのはどうか。
683デフォルトの名無しさん:2006/04/24(月) 15:52:45
>>532 ビット演算だけの足算
>>580 ビット演算だけの引算
>>603 ビット演算だけの割算

半加算器を繰り返し使って実現してるから、最悪(ビット幅-1)のループになるんで
ループしない方法は無いかという事だね。

あれば特許モノだろうな
684デフォルトの名無しさん:2006/04/24(月) 16:11:21
つか、ハードウェア上じゃビット演算だけで加減乗除してるんだから、わざわざ二度手間する必要あるのか?
CPLDとかの設計なら必要かも知れんが
685デフォルトの名無しさん:2006/04/24(月) 16:24:21
意味はさ・・・・ まず、面白いから。

次に高速化に使える場面があるかもしれないから。
たとえば、32bit1ワードに4bitのデータが8桁入ってる場合に 2つの平均を出すのを高速にやりたいとかさ
686デフォルトの名無しさん:2006/04/24(月) 16:47:39
そう言うチップ作って組込んだ方が速いぜ。
いまどきのカスタムCPUは、ニーモニックまでカスタムできるからな。
687デフォルトの名無しさん:2006/04/24(月) 17:19:42
で、それをどこに頼むんだ? 
そこらのベンチャーが気軽にASIC起こせるような環境なんて日本にゃない。
そういう面じゃ台湾どころか韓国にも完全に負けてるぜ。
688デフォルトの名無しさん:2006/04/24(月) 17:37:34
>>686
>>685 の前者が理由の殆どだと思うが。

それより
>いまどきのカスタムCPUは、ニーモニックまでカスタムできるからな。
1. 「カスタムCPU」とは?「チップ作って組込」むのではなかったのか?
2. ニーモニックはアセンブラが認識するもので、プロセッサとは関係ない。
3. 「カスタムできる」→「カスタマイズできる」では?
689デフォルトの名無しさん:2006/04/24(月) 17:50:02
素直に四則演算が、ビット演算で代用可能だというのを厨房でも実感出来るというのが このスレにとっての必要じゃないのかな
690デフォルトの名無しさん:2006/04/24(月) 18:20:08
NANDゲートがあれば何でも作れるよ。
691デフォルトの名無しさん:2006/04/24(月) 19:38:28
>>687
そりゃおまえさんの視野がせまいんじゃないのか?
気軽の程度にもよるけどな。
692デフォルトの名無しさん:2006/04/24(月) 21:34:34
取り合えず一発作成で数百万あれば作成できると思う。
請け負ってるところは結構大手でもあるし。
693デフォルトの名無しさん:2006/04/24(月) 21:39:43
俺は全然知らんが、取り合えずアルテラに連絡して紹介してもらえば?
694デフォルトの名無しさん:2006/04/24(月) 21:55:20
ASICは全然向いてないんじゃないのかな?
ワイヤードロジックで作成しなきゃ。
695デフォルトの名無しさん:2006/04/24(月) 22:55:06
で、【ビット演算だけの掛算】はドコにありますか?
696デフォルトの名無しさん:2006/04/25(火) 07:24:13
function unsigned_mpy(a,b:Cardinal):Cardinal;
begin
result:=0;
  while b<>0 do begin
  if (b and 1)<>0 then result:=add(result,a);
  a:=a shl 1;
  b:=b shr 1;
  end;
end;
697デフォルトの名無しさん:2006/04/25(火) 07:58:09
掛け算の原理
a*b = (a*2)*(b/2) = (a*2)*(b div 2 + 余り) = (a*2)*(b div 2) + a*余り

b を左シフト、aを右シフトしながら
bが奇数の時のaの値を合計してゆけば等号を満たす
698デフォルトの名無しさん:2006/04/25(火) 07:58:59
×b を左シフト、aを右シフトしながら
○b を右シフト、aを左シフトしながら
699デフォルトの名無しさん:2006/04/25(火) 13:48:53
筆算をこう表現するんだ・・・
勉強になった
700デフォルトの名無しさん:2006/04/26(水) 08:25:33
コレってビット数を数えるのに利用出来ないかな

a,bの合計ビット数は ビット数を数える関数BitCntを使って

BitCnt(a ) + BitCnt( b) = BitCnt(a and b )*2 + BitCnt(a xor b) ・・・・・無理かな
701デフォルトの名無しさん:2006/04/27(木) 21:04:45
…?
702デフォルトの名無しさん:2006/04/29(土) 14:31:16
とりあえずその式は正しいですね
703デフォルトの名無しさん:2006/04/29(土) 16:29:27
演算しないで全部パターンをROMに焼いておけば簡単じゃね?
704デフォルトの名無しさん:2006/04/30(日) 05:19:37
気分転換に

1Wordの変数edgeL,edgeRについて
必ずedgeL<=edgeRになるように必要に応じてスワップする関数をビット演算のみで作成していただけますか?
705デフォルトの名無しさん:2006/04/30(日) 07:33:29
>>704
計算なしでいけるぞ。
配列f(a,b),g(a,b)を用意する。
fはaとbの大きい方の値を返す。
for(a)for(b){if (a>b) f(a,b)=a; else g(a,b)=b;}
だ!
706デフォルトの名無しさん:2006/04/30(日) 11:16:58
ブランチフリーでお願いします
707デフォルトの名無しさん:2006/04/30(日) 11:19:55
条件は 
 1、分岐命令を使わない
 2、四則演算を使わない

代入、論理、シフト・回転のみ? 符号付か符号無しかは自由?
708デフォルトの名無しさん:2006/04/30(日) 11:46:15
組み合わせ問題だから今ひとつ
>>580の減算で 結果ではなくcのMSBを返して
f= (a xor b) and c,msb 
a=a xor f
b=b xor f



709デフォルトの名無しさん:2006/04/30(日) 12:29:44
>>707
符合付き
四則演算は加算と減算のみ使用可でお願いします
710デフォルトの名無しさん:2006/04/30(日) 13:16:21
符号付か。 オーバーフローフラグも使っちゃだめ?

加算と減算だけ? and もシフトも無しかよ
711デフォルトの名無しさん:2006/04/30(日) 13:21:36
可です
712デフォルトの名無しさん:2006/04/30(日) 13:34:54
加減有りならこれでいいや
inline void swap_if(WORD&a,WORD&b){
    WORD c = a-b>>16 & (a^b);
    a^=c;b^=c;
}
713デフォルトの名無しさん:2006/04/30(日) 13:37:06
ダメだオーバーフローした時に巧く動かないや
714デフォルトの名無しさん:2006/04/30(日) 13:59:14
WORD はwindowsでは符号無16bitの筈なので (a-b)>>16 はゼロになるのだと思うのだが
715デフォルトの名無しさん:2006/04/30(日) 13:59:54
>>714
つ 整数の昇格
716デフォルトの名無しさん:2006/04/30(日) 14:14:51
つまり int が32bit以上の環境を仮定してるわけか なるほど
717デフォルトの名無しさん:2006/04/30(日) 19:27:41
struct IO
{
  struct
  {
    unsigned short AAA 2:
    unsigned short BBB 2:
    unsigned short CCC 2:
    unsigned short DDD 2:
    unsigned short EEE 2:
    unsigned short FFF 2:
    unsigned short GGG 2:
    unsigned short HHH 2:
  }BIT;
};

こんな構造体があったと仮定して
unsigned BBBに0x01をセットした場合、上位4ビット目(2^12ビット)
に値が入ると仮定していいのでしょうか?
718・∀・)っ-○◎●:2006/04/30(日) 19:33:27
少なくともx86では下位3〜4ビット目に0x01が入る
719デフォルトの名無しさん:2006/04/30(日) 19:46:38
その構造体がさすのがIOレジスタの場合
やはりBigエンディアンとLittleエンディアンとでは違うものなのでしょうか?

今、作成しているプログラムがSuperHというCPUなのですが、
それを作成するための統合開発環境HEWが吐き出すIOレジスタのヘッダファイルが
こんな形です。

しかし、プログラムを作成する際、雛形の作成においてCPUの種別として
Bigエンディアンを選んでもLittleエンディアンを選んでも同じヘッダを作成します
その場合、きちんとIO設定できるか不安で質問しました。
720デフォルトの名無しさん:2006/04/30(日) 19:52:33
>>718
大嘘を書くな。ビットフィールドが下から使われるなんて規格はない。

>>719
環境ごとに調べるしかないわけだ。CPUによっては、8ビットアクセスと32ビットアクセスで
出力されるラインが換わる可能性もあるから要注意。
721・∀・)っ-○◎● ◆toBASh.... :2006/04/30(日) 19:56:30
> ビットフィールドでは先に書いたほうが上位ビットになるか、下位ビットになるかは
> CPUと処理系に依存する。H8用GCCの場合、先に書いたほうが上位ビットになるが、
> CPUやコンパイラが異なる環境では、逆になることもあるので注意しよう
> (たとえば、パソコンのx86系CPUはリトルエンディアンなので、通常、先に書いた方が
> 下位ビットになる)。
722・∀・)っ-○◎● ◆toBASh.... :2006/04/30(日) 20:03:17
まぁとりあえず>>718は嘘だな
723デフォルトの名無しさん:2006/04/30(日) 20:48:50
>>719
外付けのI/Oの場合はエンディアンが違えば違う事になります。

内蔵I/Oの場合、エンディアンを変更するのですから、結果としてワードアクセスでは同じ事になります
724デフォルトの名無しさん:2006/05/02(火) 10:24:50
ビッグエンディアン
しばしばリトルエンディアンよりも優れたものとされている

リトルエンディアン
しばしばビッグエンディアンよりも優れたものとされている
725デフォルトの名無しさん:2006/05/02(火) 10:27:46
>>724
リナクス  -> リナックスを参照

リナックス -> リナクスを参照

とかあったなぁw
726デフォルトの名無しさん:2006/05/02(火) 21:28:00
真コンピュータ用語辞典だっけ?
727デフォルトの名無しさん:2006/05/03(水) 01:24:44
>>725
広辞苑で循環参照したのがあったような気がするが何だか忘れた。
728デフォルトの名無しさん:2006/05/03(水) 10:49:23
キーワード【会社 団子 コード 人 bits レジスタ 論理 】
729デフォルトの名無しさん:2006/05/03(水) 10:51:57
>>726
同志よ、よく覚えてたなw
730デフォルトの名無しさん:2006/05/03(水) 19:55:55
エンディアンのネタ元はガリバーのこびとの国
731デフォルトの名無しさん:2006/05/03(水) 20:12:28
なにをいまさら?
732デフォルトの名無しさん:2006/05/03(水) 20:25:47
エンディアン嘘ツカナイ
733デフォルトの名無しさん:2006/05/03(水) 22:46:53
卵は真中から割る。
734デフォルトの名無しさん:2006/05/04(木) 00:01:58
memsetを超える高速,memsetをCで作ろうとしたが、さすがに無理だった
やはりアセンブラか・・・Cでは無理かな?
735デフォルトの名無しさん:2006/05/04(木) 00:18:36
絶対無理
736デフォルトの名無しさん:2006/05/04(木) 00:24:00
むしろCからmemsetを超える高速memsetを生成できる
究極の最適化Cコンパイラを作るべきかと。
737デフォルトの名無しさん:2006/05/04(木) 09:10:14
やるとするなら再配置される命令アドレスを最適化したり
memsetを呼び出すメモリ側のアドレスを最適化したりとか?
738デフォルトの名無しさん:2006/05/04(木) 09:55:57
_memset
MOV.L R12,@-R15
MOV.L R13,@-R15
MOV.L R14,@-R15

MOV R6,R1
MOV #H'1F,R2
MOV R4,R6
CMP/HS R2,R1
ADD R1,R6
BF/S @H'1510:8
MOV R5,R13
MOV R6,R0
AND #H'0F,R0
MOV #H'01,R12
CMP/GT R12,R0
MOV R0,R5
BF/S @H'14C8:8
SUB R0,R1
ADD #H'FE,R5
MOV R6,R2
ADD #H'FE,R6
CMP/GT R12,R5
MOV.B R13,@-R2
BT/S @H'14BA:8
MOV.B R13,@R6
CMP/PL R5
BF @H'14CE:8
MOV.B R13,@-R6
EXTU.B R13,R5
739デフォルトの名無しさん:2006/05/04(木) 09:56:35
MOV R5,R7
SHLL8 R7
OR R7,R5
MOV R1,R7
SHLR2 R7
SHLR2 R7
MOV R7,R2
SHLL2 R2
MOV R5,R14
SHLL16 R5
SHLL2 R2
CMP/GT R12,R7
OR R5,R14
BF/S @H'1504:8
SUB R2,R1
MOV.L R14,@-R6
MOV.L R14,@-R6
MOV.L R14,@-R6
MOV.L R14,@-R6
MOV.L R14,@-R6
ADD #H'FE,R7
MOV.L R14,@-R6
MOV.L R14,@-R6
CMP/GT R12,R7
BT/S @H'14EE:8
MOV.L R14,@-R6
CMP/PL R7
BF @H'1510:8
740デフォルトの名無しさん:2006/05/04(木) 09:58:35
SHLL2 ・・・・・って早速インターフェース付録のSH2か?
741デフォルトの名無しさん:2006/05/04(木) 09:58:52
MOV.L R14,@-R6
MOV.L R14,@-R6
MOV.L R14,@-R6
MOV.L R14,@-R6
MOV #H'01,R12
CMP/GT R12,R1
BF @H'1524:8
ADD #H'FE,R1
MOV R6,R2
ADD #H'FE,R6
CMP/GT R12,R1
MOV.B R13,@-R2
BT/S @H'1516:8
MOV.B R13,@R6
CMP/PL R1
BF @H'152A:8
MOV.B R13,@-R6
MOV R4,R0
MOV.L @R15+,R14
MOV.L @R15+,R13
RTS
MOV.L @R15+,R12
742デフォルトの名無しさん:2006/05/04(木) 10:00:11
↑このmemsetをCで書くとどうなるんだ?
743デフォルトの名無しさん:2006/05/04(木) 10:19:40
遅くなる。
744デフォルトの名無しさん:2006/05/04(木) 15:24:18
上記のmemsetはHEWで作成しました。
最適化はスピード優先です。

どうやっても自作のメモリクリア関数とmemsetでのゼロクリアとでは
memsetのほうが速かったです(最適化なしのmemsetなら自作のほうが速い)

他のCPUではどうなのかわかりませんが、SH-2では私ではmemsetに勝てる関数は作成できませんでした
なにか知恵がありましたら教えてください。


・・・あとひとつ
MOV R10, @R14+

MOV R10. @-R14
では速度は変わらないのでしょうか?
上のmemsetではやたら@-R6などやってましたけど・・・

とりあえず
MOV R0 ,@-R15

MOV @R15+, R0
ではサイクル数など同じでしたけど。
745デフォルトの名無しさん:2006/05/04(木) 16:05:09
SHは特殊な最適化を要求されるから、

 Cで最適化し易いコードを書く > ヘタにアセンブラで書く

となってしまう。
 最適化し易いコードってのは、構造体のサイズをアドレッシングに合わせて小さくするとか
 ある程度のサイズの関数に書くとかの事ね


アセンブラで書くとなると
最適化用に、HEWにソフトウエアでシミュレートする機能があるでしょ?
それ見てスロットを埋めてゆかないといけないのさ
これがなかなか厄介なパズル
746デフォルトの名無しさん:2006/05/04(木) 19:32:55
ようはSHという環境ではCでmemsetの最適化ありにかなうプログラムはできないということじゃないの?
747デフォルトの名無しさん:2006/05/04(木) 19:41:44
だろうな。 単純な処理だから可能な殆どのパターンは持っていて、
それを、可能な組み合わせを全部調べてもっともスロットが綺麗に埋まるように配置してるんだろう。
これに人力で勝とうとするとアルゴリズムで勝つしかないだろうけど、

memsetじゃ、やりようがないだろ?
748デフォルトの名無しさん:2006/05/04(木) 21:02:45
じゃあ、memsetに一番近づける、高速自作memsetをCで書くと、どう書くのですか?
アセンブラとCに精通しているみなさん教えてください。
749デフォルトの名無しさん:2006/05/04(木) 23:19:04
なんかスレ違いでないか?
750デフォルトの名無しさん:2006/05/05(金) 00:00:54
>>748 昔、for と switchを入れ子にしたコードで、へーというようなのを見たことがある。

確か 32bitマシンで バイト境界になるようにポインタの下位2bitでswitchし
ループは32bit単位で行うと

そのヒントで考えてみたら?
751デフォルトの名無しさん:2006/05/06(土) 17:30:01
1からインクリメントしていった時の一番右の立っているビットの位置の列が
欲しいんですがいい方法ありますか?
0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 4 ...
というのが欲しいです。
752デフォルトの名無しさん:2006/05/06(土) 17:34:07
>>751
とりあえず意味不明
753デフォルトの名無しさん:2006/05/06(土) 17:37:46
数学的に解くのが簡単そうだが、
ビット演算で解きたいんだろうな・・
754デフォルトの名無しさん:2006/05/06(土) 17:38:08
1 001 0
2 010 1
3 011 0
4 100 2
5 101 0
6 110 1
左が十進、真ん中が二進、右が二進表現で立っている最右ビットの位置です。
なにかいい方法がありそうな気がするんですが。
755デフォルトの名無しさん:2006/05/06(土) 17:39:37
>>151
単純に数えればいいんじゃないの?

一番左のビット位置を知るには >>7

それをカウントする方法は>>277


もっと効率いい方法が無いかという事? 表を作るんだから、それほど効率は上がらないだろう
756デフォルトの名無しさん:2006/05/06(土) 17:40:32
ごめん >>377 だった
757デフォルトの名無しさん:2006/05/06(土) 17:45:58
>>755
表を作るというかその場でつかいたいんですよね。
表を作るんならエラトステネスのふるいみたいなかんじで2のべき乗のところをインクリメント
していけばできそうですけどね。

元のコードが

for(i = 1; i < (1 << 16); i++){
func(ffs(i));
}
みたいな感じで、ちょっと改良したのが

func(0);
func(1);
func(0);
for(i = 1; i < (1 << 16) >> 2; i++){
func(ffs(i) + 2);
func(0);
func(1);
func(0);
}
みたいな感じです。
758デフォルトの名無しさん:2006/05/06(土) 17:48:49
ffsはいろいろ試して
unsigned ffs(unsigned n){
n = (~n & (n - 1));

n = n - ((n >> 1) & 0x5555);
n = (n & 0x3333) + ((n >> 2) & 0x3333);
n = (n + (n >> 4)) & 0x0F0F;
n = n + (n >> 8);
return n & 0x1F;
}
としています(高々16ビットなので)。

インクリメントしていくんなら ffsを呼ばないでできないかなあ
と思っているんですが無理でしょうか?
759デフォルトの名無しさん:2006/05/06(土) 17:51:00
>>757
使い道は何? その逆にMSBの位置を知るのは浮動小数点化なんかで必要になるのは判るのだけど
760デフォルトの名無しさん:2006/05/06(土) 17:58:26
memsetにベリファイ機能をもつ関数を作成したいと思ってます。
しかも、それをmemsetよりも速い、もしくは近いレベルまでにしたいと思ってます。

何かよい方法はありますか?
761デフォルトの名無しさん:2006/05/06(土) 18:00:26
>>759
学校の宿題でブロック符号の符号語の重み分布を求めるプログラムを書くというやつでして
ハミング距離が1の符号を辿っていくときにグレイコードの反転するビットの位置がこれなんです。
nビット目が反転する時は生成行列の下からn行目を足すという感じで 2^16-1回足すと
2^16個ある符号を全て得ることができるんです。

別に高速化する必要はないんですが、かっこいいやりかたがあるんじゃないかっていう好奇心です。
762デフォルトの名無しさん:2006/05/06(土) 18:01:56
16bitの範囲で順にfuncに引数として渡すだけでいいのなら
再帰的にスタックを16段使って出力すればいいんじゃないの?
763デフォルトの名無しさん:2006/05/06(土) 18:06:17
>>760
具体的に目的を提示しないと答えが出ないと思うよ。
つーか、制御系スレ向きかな。
764デフォルトの名無しさん:2006/05/06(土) 18:08:54
>>762
どういうやり方なんでしょうか?
コルーチンぽいのがあればできる予感はするんですが。
765デフォルトの名無しさん:2006/05/06(土) 18:09:01
>>760
ちょっと理屈で考えてみろ

メモリーに書き込むにはサイクルが必要だ
メモリーから読み込むにもサイクルが必要だ。

両方をやろうと欲張ってるのに、片方だけやってるのと同じコストで出来る筈がない。
766デフォルトの名無しさん:2006/05/06(土) 18:11:31
ようはmemset(address, 0x35, sizeof(address));
として仮に1024バイト分0x35を書き込んだと仮定します。
その際に本当に0x35で書き込まれたのかをチェックしたいのです。
そのチェック方法と、さらに
1.書き込みながら随時チェック
2.すべてのデータを書き込んだ後全部チェック
のどちらが速いかなどです。
767デフォルトの名無しさん:2006/05/06(土) 18:18:14
CPUのキャッシュについてどう思う?
768デフォルトの名無しさん:2006/05/06(土) 18:21:16
"1.書き込みながら随時チェック "
ではキャッシュのエラーを検出出来ないので、
"2.すべてのデータを書き込んだ後全部チェック"
が正解。

なんてね
769デフォルトの名無しさん:2006/05/06(土) 18:28:43
それでもキャッシュに収まってたら(ry
770デフォルトの名無しさん:2006/05/06(土) 18:30:25
ヴェリファイに失敗したらどうすわけ?
771デフォルトの名無しさん:2006/05/06(土) 18:31:22
チェックする暇があったら、もう一回書き込め。
 
772デフォルトの名無しさん:2006/05/06(土) 18:34:06
>>764
再帰的に書けばいいという事
最初に 0 0x10000 16 16 の4つを渡して

先頭で最後の引き数を1減らす 16->15...0と
  これが0になったら2番目を出力して終わり
  でなければ、自分自身を2度呼び出す
 1番目は 0+,0x10000/2,16,15
 2番目は 0+0x10000/2,0x10000/2,15,15

結果、最後の引き数が0の時は、1番目の引き数は2進数を順を刻むことになり3番目の引数が目的
773デフォルトの名無しさん:2006/05/06(土) 18:47:29
#include <stdio.h>
void doit(int i)
{ printf("%d\n", i);}
template<int N> void FFS()
{ FFS<N-1>(); doit(N); FFS<N-1>();}
template<> void FFS<2>( )
{ doit(0); doit(1); doit(0); doit(2); doit(0); doit(1); doit(0);}
int main()
{ FFS<16>();}

ビット演算関係ないけど(w
774デフォルトの名無しさん:2006/05/06(土) 19:39:02
>>773 ただ繰り返すだけのように見えるのがミソなのか?
775デフォルトの名無しさん:2006/05/06(土) 19:52:46
ただ繰り返す?
776デフォルトの名無しさん:2006/05/06(土) 20:00:24
スマン doit(N); を見損なった。
しかし、逆アセンブルした奴は目を剥くだろうな
777デフォルトの名無しさん:2006/05/06(土) 20:45:51
>>772
よく分からないんですが、それは条件分岐をたくさんするんでしょうか?
だったら ffsと変わらない気がします。
778デフォルトの名無しさん:2006/05/06(土) 20:57:15
>>777
条件分岐が嫌なら、同じような関数を16個ほど書いてネストすればいい
それでも >>773よりマシだ
779デフォルトの名無しさん:2006/05/06(土) 20:58:52
テンプレート嫌い?
780デフォルトの名無しさん:2006/05/06(土) 21:00:48
それから773のように工夫すれば段数はそれだけ減らせる
また、ネスト深さの引き数はいらない
1番目2番目の引き数も、何の数かが必要なければいらない。
つまり引き数は一つでいい
781デフォルトの名無しさん:2006/05/06(土) 21:04:13
つまりはこういうこと。
void dispffs( int level){
if( level == 2 ) { doit(0); doit(1); doit(0); doit(2); doit(0); doit(1); doit(0); return;}
dispffs( level-1); doit( level ); dispffs( level-1);
}
782デフォルトの名無しさん:2006/05/06(土) 21:22:48
>>781
おお、できました。深さは高々16だし、幅が2^16-1ってだけで負担にはならないですね。
再帰で解くという発想がありませんでした。やりたかったこととは違うんですが、これは美しいですね。
関数呼び出しのコストとか考えると微妙なのかもしれませんが。
ただ if(level == 0) doit(0) でいいですよね。
783デフォルトの名無しさん:2006/05/06(土) 21:30:40
すいません。少しでも段数減らすためってことですね。
実際に速度を測ったら普通に ffs呼んだ方が速かったので悲しかったです。
自分でスタック用意すれば速くなるかもしれませんね。
784デフォルトの名無しさん:2006/05/06(土) 21:43:10
一応スタック自前バージョンを書いておきます。ビット演算関係なくてすいません。

unsigned Stack[16];
unsigned *SP = Stack + 1;

void comp(unsigned n){
for(;;){
if(n == 0){
func(0);

n = *--SP;
if(n == 0) return;
}
else {
*SP++ = n;
--n; continue;
}

func(n);
--n;
}
}
785デフォルトの名無しさん:2006/05/06(土) 21:44:23
つうかffs(3)て大抵そのアーキテクチャに最適化されてるから、
Cで書いて、より速いのはなかなか作れんだろう。

巨大テーブル使うんなら別だが。
786デフォルトの名無しさん:2006/05/06(土) 21:58:15
なんかおかしかったのでもう一度。

>>758
たしかにそうですね。>>758より速かったです。
インラインアセンブラで bsf使って書いたらすごい遅かったんですけどね。
/usr/src/lib/libc/string/ffs.c は普通のCのコードだしソースがどこにあるのか
分からない...
0チェックしなくていいからもっと高速にかけるかもしれないんですけどね。

void comp(unsigned n){
for(;;){
if(n == 0){
func(0);

n = *--SP;
if(n == 0) return;
func(n);
}
else {
*SP++ = n;
}
--n;
}
}
787デフォルトの名無しさん:2006/05/06(土) 22:11:15
速度があまりに違うようだと計測方法それ自体を見直した方が・・
最適化でコードがばっさりなくなってたりとか。
788デフォルトの名無しさん:2006/05/06(土) 22:27:23
789デフォルトの名無しさん:2006/05/06(土) 22:47:17
というか、bsfだな
790デフォルトの名無しさん:2006/05/06(土) 22:54:43
1.
*address = data;
address++;
*address = data;
address++;
*address = data;
address++;
*address = data;
address++;



2.
address[0] = data;
address[1] = data;
address[2] = data;
address[3] = data;
address += 4;

の処理があったとして、これをループ処理を行った場合、1と2ではどちらが速いでしょうか?
791デフォルトの名無しさん:2006/05/06(土) 22:59:30
memcpy系統はそもそもメモリが遅すぎるので
64bitまとめて〜とか、アラインメントを〜とかを考えないと、
CPU側に多少無駄があっても変わらない。
792デフォルトの名無しさん:2006/05/06(土) 23:01:26
最適化スレじゃないんだが・・・・・

>>790 基本的にコンパイラと環境による
話題のSHでは 
下の場合は効率の良いアドレッシングモードがあるので速いかもしれないし
上の方が巧く命令が馬って速いかもしれないし

パソコンのCPUならメモリアクセスに隠れてしまうし

という事で、どっちが速いか判らん
793デフォルトの名無しさん:2006/05/06(土) 23:12:22
*++address=*++address=*++address=*address=data;
最適化支援
794デフォルトの名無しさん:2006/05/07(日) 00:23:14
>>786
ヘッダに

#ifdef __GNUC__
#define ffs __builtin_ffs

の類があったりしないか?

ところで、遅くなった bsf の淫乱アセンブラの表記に興味がある。
795デフォルトの名無しさん:2006/05/07(日) 09:20:04
>>794
strings.h にも ffs.cにも書いてありませんが、
/usr/src/lib/libc/arch/i386/string/ffs.Sに >>788と同じファイルが
ありました(NetBSDです)。
インラインアセンブラは
asm("ffs2:");
asm("bsfl 4(%esp), %eax");
asm("ret");
って書いただけです。
ffsは-O2以上で
xorl %eax, %eax
bsfl %ecx, %edx
sete %al
negl %eax
orl %eax, %edx
incl %edx
というのが埋めこまれていました。ffs2は
pushl %ebx
call ffs2
movl %ebx, (%esp)
となっていました。他にもGCCの最適化が頭良すぎてちゃんと計れてないっぽいです。
副作用を起こさない、とか引数一緒なら返り値一緒ってどうやって判断してるんでしょうか?
796デフォルトの名無しさん:2006/05/07(日) 10:27:44
>>795
GCC on NetBSD/x86だったら以下のサンプルをコンパイルしてみそ。

int f(unsigned a)
{
return __builtin_ffs(a);
}

int b(unsigned a)
{
int r;
asm("bsfl %1,%0": "=r"(r): "g"(a));
return r;
}

インラインアセンブラの使い方がよくない。
gcc asm constraint でぐぐれ。
797デフォルトの名無しさん:2006/05/07(日) 16:16:17
>>796
インライン展開されるようになりました。
オリジナルの ffsより若干速いって感じです。

この改良ffsを >>757の下のコードで使うと >>786をちょっと改良したやつより速かったです。
そしてテーブル使うよりも速かったです。

僕がイメージしていたのは変数二つをループでいじくりまわして
0 1 0 2 0 1 0 3 という結果を得るという感じだったんですけど
bsfがあるならそれを使った方がよさそうですね。
移植性考えるなら ffs(i) - 1を使ってもいいと思うんですが
インライン展開されて
incl %eax
decl %eax
となっていて萎えました。
798デフォルトの名無しさん:2006/05/07(日) 21:55:46
色々試しましたところ、
メモリをクリア&確認する際に

1.
アドレスに0をセット
0になってるかORしてチェック
アドレスを加算
以下サイズ分ループ

2.
アドレス+サイズを算出(終了アドレス+1)

アドレスを減算
アドレスに0をセット
0になってるかORしてチェック
以下サイズ分ループ

1と2で、やってることは似たようなもののはずなのに(ただ単にアドレスを加算してるか減算しているかの違いぐらい)
なぜか処理速度(サイクル数)が異なってました。

原因として何が考えられますか?
799デフォルトの名無しさん:2006/05/07(日) 22:46:15
スレ違い。
800デフォルトの名無しさん:2006/05/07(日) 22:47:19
>>798
アセンブリ出力を見て調べろ。
801デフォルトの名無しさん:2006/05/08(月) 02:05:35
dec eax
jnz loop

inc eax
cmd eax,ecx
jne loop
のちがいじゃねーの
802デフォルトの名無しさん:2006/05/08(月) 08:15:38
↓反応した奴は池沼
803デフォルトの名無しさん:2006/05/08(月) 09:05:02
あびゃっばばばぁばばあ
804デフォルトの名無しさん:2006/05/21(日) 13:12:49
あげ
805デフォルトの名無しさん:2006/05/21(日) 13:29:27
>798
ようはパイプラインの問題だけだと思う
806デフォルトの名無しさん:2006/05/21(日) 16:35:41
ベンチャーズの季節か。
807デフォルトの名無しさん:2006/05/28(日) 21:50:29
あげ
808デフォルトの名無しさん:2006/06/01(木) 04:03:02
(1 << 7) << 3
809デフォルトの名無しさん:2006/06/03(土) 03:19:55
1<<(7+3)
810デフォルトの名無しさん:2006/06/03(土) 10:04:28
2^7 x 2^3 = 2^(7+3)
811デフォルトの名無しさん:2006/06/05(月) 17:02:57
ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか
ttp://www.amazon.co.jp/exec/obidos/ASIN/4434046683

この本を読めるようになるには数学以外でどの程度の知識が必要でしょうか?
812デフォルトの名無しさん:2006/06/05(月) 17:20:11
>>811
その書籍が記述されている言語の基本知識は最低限必要です
例:日本語
あかいさくらのはながさいた
813デフォルトの名無しさん:2006/06/05(月) 17:59:18
2^7^7 の 1 桁目の数字は?
814デフォルトの名無しさん:2006/06/05(月) 22:48:55
0
815デフォルトの名無しさん:2006/06/06(火) 02:14:19
2^7^7 の 1 桁目の数字は?
816デフォルトの名無しさん:2006/06/06(火) 02:14:53
まちがえた
ごめん

7^7^7 の 1 桁目の数字は?
817デフォルトの名無しさん:2006/06/06(火) 04:23:27
>>816
最下位ビットを聞いているのなら1だ。
a^aは常に0だから、簡単にわかる。
818デフォルトの名無しさん:2006/06/06(火) 14:52:56
べき乗?

7

819デフォルトの名無しさん:2006/06/06(火) 17:35:12
ここで聞いてるんだから、やっぱりXOR演算子なんでしょう。
820デフォルトの名無しさん:2006/06/06(火) 22:39:49
質問の意図がわからんから適当に答えてるんだと思うが?
821デフォルトの名無しさん:2006/06/08(木) 05:04:35
まじめに答えてもらおうと思ってないから適当に質問されているのだと思うが?
822デフォルトの名無しさん:2006/06/08(木) 05:18:19
誰か >>821 の文章に主語を補完してくれないか。俺は良く分かんなかった。
823デフォルトの名無しさん:2006/06/08(木) 16:12:37
つまりネタがありません
と翻訳してみたが
824デフォルトの名無しさん:2006/06/24(土) 22:15:33
(((( ;゚Д゚)))ガクガクブルブル2005年度入社278人目
http://money4.2ch.net/test/read.cgi/employee/1151055613/

(((( ;゚Д゚)))ガクガクブルブル2005年度入社278人目
http://money4.2ch.net/test/read.cgi/employee/1151055613/

(((( ;゚Д゚)))ガクガクブルブル2005年度入社278人目
http://money4.2ch.net/test/read.cgi/employee/1151055613/

(((( ;゚Д゚)))ガクガクブルブル2005年度入社278人目
http://money4.2ch.net/test/read.cgi/employee/1151055613/
825デフォルトの名無しさん:2006/06/24(土) 22:18:47
もっと議論したまえ。
826デフォルトの名無しさん:2006/06/25(日) 00:15:53
しょうがねぇな
n x nの正方pixelのfontデータを90度回転させる
効率のよい処理方式でも考えてみれ
827デフォルトの名無しさん:2006/06/25(日) 00:42:25
シフトとキャリー使って良いですか
828デフォルトの名無しさん:2006/06/25(日) 01:42:02
>>826
n=16用だがfontx[]に16x16のbitmapが格納されているとして
fonty[]に90度左回転したビットマップを格納する処理w

unsigned short fontx[16],fonty[16];

#define ROT(var,x,y) (0!=((var)[(x)] & (1 << (y))))<<(x)
#define ROT1616(to,fr,x) (to)[(x)]= \
  ROT((fr),15,15-(x))|ROT((fr),14,15-(x))|ROT((fr),13,15-(x))|ROT((fr),12,15-(x))|\
  ROT((fr),11,15-(x))|ROT((fr),10,15-(x))|ROT((fr), 9,15-(x))|ROT((fr), 8,15-(x))|\
  ROT((fr), 7,15-(x))|ROT((fr), 6,15-(x))|ROT((fr), 5,15-(x))|ROT((fr), 4,15-(x))|\
  ROT((fr), 3,15-(x))|ROT((fr), 2,15-(x))|ROT((fr), 1,15-(x))|ROT((fr), 0,15-(x))
:
  ROT1616(fonty, fontx, 0); ROT1616(fonty, fontx, 1);
  ROT1616(fonty, fontx, 2); ROT1616(fonty, fontx, 3);
  ROT1616(fonty, fontx, 4); ROT1616(fonty, fontx, 5);
  ROT1616(fonty, fontx, 6); ROT1616(fonty, fontx, 7);
  ROT1616(fonty, fontx, 8); ROT1616(fonty, fontx, 9);
  ROT1616(fonty, fontx,10); ROT1616(fonty, fontx,11);
  ROT1616(fonty, fontx,12); ROT1616(fonty, fontx,13);
  ROT1616(fonty, fontx,14); ROT1616(fonty, fontx,15);
829デフォルトの名無しさん:2006/07/16(日) 17:27:14
漏れら極悪非道のageブラザーズ!
今日もネタもないのにageてやるからな!
 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ∧_∧   ∧_∧    age
 (・∀・∩)(∩・∀・)    age
 (つ  丿 (   ⊂) age
  ( ヽノ   ヽ/  )   age
  し(_)   (_)J
830デフォルトの名無しさん:2006/07/16(日) 17:30:21
数値をレジスタに代入するときにPUSH、POP命令で代入した方がいいのはなぜですか?
831デフォルトの名無しさん:2006/07/16(日) 17:45:01
どのプロセッサの話だよw
832830:2006/07/16(日) 18:02:49
>>831
すまん
x86です
833デフォルトの名無しさん:2006/07/16(日) 18:10:40
任意の桁数の2進数をを簡単に素早く反転(?)させる方法はありませんか?

こんな感じの反転

110100
 ↓
001011
834デフォルトの名無しさん:2006/07/16(日) 18:12:21
POP命令で可能と思うが、PUSHはねえぞ
835デフォルトの名無しさん:2006/07/16(日) 18:13:14
>>833はまちがい

10011
 ↓
11001


こんな感じの最上位から最下位ビットの並びを
最下位から最上位へ変換ということです
836デフォルトの名無しさん:2006/07/16(日) 18:18:13
fftか?
2のべき乗でビット転置やって 右シフトすれば良くないですか?
5bitなら8bitで十分ですな

n = (n << 4) & 0xF0 | (n >> 4) & 0x0F;
n = (n << 2) & 0xCC | (n >> 2) & 0x33;
n = (n << 1) & 0xAA | (n >> 1) & 0x55;
n >>= 3;



あんまりビット数が多い場合はbyteレベルならbswapとかシャッフル命令とかを使って、
バイト単位の反転を行っておいてからやると高速化できるかと思われます
838デフォルトの名無しさん:2006/07/16(日) 18:23:34
>>837
ダンゴきたあああああああああああああああああああああああああ
n = ((n << 4) & 0xF0) | ((n >> 4) & 0x0F);
n = ((n << 2) & 0xCC) | ((n >> 2) & 0x33);
n = ((n << 1) & 0xAA) | ((n >> 1) & 0x55);
n >>= 3;

演算子の評価順位が不安なので修正
840デフォルトの名無しさん:2006/07/16(日) 18:37:23
ダンゴさんありがとお
841デフォルトの名無しさん:2006/07/17(月) 06:19:00
char bitrev[] = {
0x00, 0x80, 0x40, 0xC0, ....
};
って、テーブル作っとく。
842デフォルトの名無しさん:2006/07/17(月) 10:15:03
最近のコンパイラって、>841みたいなのをxlat使うのかなぁ。
尤も、そもそも最近のCPUでxlatが速いかどうかが問題だけど。
843デフォルトの名無しさん:2006/07/17(月) 10:51:02
>>839, >>841, 4bitや2bitに切ってswitch

switch(n&0xf){
case 0x0:H=0x00;break;
case 0x1:H=0x80;break;
...
}
switch(n&0xf0){
case 0x00:L=0x0;break;
case 0x10:L=0x8;break;
...
}
return H|L;

の4パターンを関数にしてざっと測ってみたところ、時間的にはどれも同じだった。
関数コールのオーバーヘッドで埋まる程度の処理って事だ。
なので素直に>>839でおk
844デフォルトの名無しさん:2006/07/17(月) 11:43:35
>839よりは>841の方が素直だと思う漏れもいる。
>>844
ビット数が増えるとテーブルじゃ苦しいんだよね

32bitなら
n = (n << 16) | (n >> 16);
n = ((n << 8) & 0xFF00FF00) | ((n >> 8) & 0x00FF00FF);
n = ((n << 4) & 0xF0F0F0F0) | ((n >> 4) & 0x0F0F0F0F);
n = ((n << 2) & 0xCCCCCCCC) | ((n >> 2) & 0x33333333);
n = ((n << 1) & 0xAAAAAAAA) | ((n >> 1) & 0x55555555);



VC2005使う限りでは組み込みのbswap使うほうが速かった
n = _bswap( n );
n = ((n << 4) & 0xF0F0F0F0) | ((n >> 4) & 0x0F0F0F0F);
n = ((n << 2) & 0xCCCCCCCC) | ((n >> 2) & 0x33333333);
n = ((n << 1) & 0xAAAAAAAA) | ((n >> 1) & 0x55555555);
846デフォルトの名無しさん:2006/07/17(月) 12:19:19
さて、上司からアホなことを言われた俺がやってきましたよ。
なんでもmemsetやmemcpyやmemmoveなどを改良して高速動作するように
作れとのこと。何かしらサンプルはありますか?
そもそも標準関数であるmem系を改良する価値はあるのか?
847デフォルトの名無しさん:2006/07/17(月) 12:23:00
>>846
つ memcpy_amd
そのへんはVCなら最適化すれば組み込みの命令に展開されるのであんまり意味はないかと

一番有効と思われるのがMMX/SSEを使う方法ですな。
ビット演算云々よりアセンブラとかSIMD関連になります


ただ、キャッシュ内でこね回すだけならともかく、メインメモリからの読み書きなら
FSBで律速されるのであんまり意味は薄いです
849デフォルトの名無しさん:2006/07/17(月) 12:59:35
NomisoBraaanにいくつかリンクがあるよ。
850デフォルトの名無しさん:2006/07/17(月) 13:41:04
VCの組み込みmemcpyは遅い。
しかし、よしんば速くなったところで2〜3倍速なので
劇的に速くなるとも思えない。

まだボトルネックを確認してなければプロファイルが先。
851864:2006/07/17(月) 13:47:24
私としたことが環境を書いてないですね。
用途はシーケンサ制御です。
そのため、あるバッファからあるバッファへメモリ展開などを行う際に
高速化する必要があるらしいのです。

CPUはSH-3というものを使っています。
コンパイラはSHの純正であるSHCの最新版です。

正直、じゃあ上司が作れば?と思うのですがいえない今日この頃。
でもある意味ここで聞く内容ではない気もしてきました。
聞くとしたら組み込み系?それともC言語系ですかね?

ここで聞いた理由はここの人たちはレベルが高いような気がしましたので
852デフォルトの名無しさん:2006/07/17(月) 13:50:12
864ではなく846でした
853デフォルトの名無しさん:2006/07/17(月) 14:10:07
sh3で作るならMAとIFをぶつからないようにして、
あとは素直にalignmentで場合分けして最適化すれば十分速くなる。
854デフォルトの名無しさん:2006/07/17(月) 14:11:54
>>851
どこがビット演算なのかと。で、本当にボトルネックがmemcpy()なのかどうかの確認はすること。
「メモリ展開」処理そのものが遅かったら転送速度を上げても無駄だぞ。
855デフォルトの名無しさん:2006/07/17(月) 14:22:06
>>851
SH4をSHCでやってる仲間wだが、
ちょっといいたいことがある。


上司をここに呼べwww


つーかビット演算と関係ネーシ。
856デフォルトの名無しさん:2006/07/17(月) 14:24:29
ここで聞いたのは
>ここで聞いた理由はここの人たちはレベルが高いような気がしましたので
だからじゃねーの?

何を持ってレベルが高いのかは不明だが
857デフォルトの名無しさん:2006/07/17(月) 14:27:16
確かにアセンブラスレや制御系スレよりここの方が賑やかだけどねぇ。
858デフォルトの名無しさん:2006/07/17(月) 14:48:38
んで結論は「わかりません」かw
まあ846もここで聞くのがお門違いってこと。
859デフォルトの名無しさん:2006/07/17(月) 15:28:10
こんな場所で>>846のような質問しちゃうアホが部下なら>>846みたいな
アホな事やらせてみるのもありだと思う。
860デフォルトの名無しさん:2006/07/17(月) 18:02:58
>>845
バイト単位ならエンディアン変換関数があるんだから、それをかけた後に各バイトにビット反転かければいいじゃん。
861デフォルトの名無しさん:2006/07/17(月) 18:04:10
>>860
1の補数?
862デフォルトの名無しさん:2006/07/17(月) 18:58:22
ttp://homepage1.nifty.com/herumi/adv/bbslog/bbs10.html
ここの493。

x86なら、leaやbswapが使えておいしい。
>>862
いや、2個目はそれと全く同じことやってますが。
VC2005の_bswap()はそのまんまbswapに展開されますぜ
864デフォルトの名無しさん:2006/07/17(月) 21:27:13
>>863
いや、単に解説投下しただけで、他意はないです。
865デフォルトの名無しさん:2006/08/08(火) 23:08:26
; アルゴリズムオタク スレから誘導されてやってきました.

x が与えられたとき,2^(a+1) > x ≧ 2^a となる 2^a を高速に(ループ等を使わ
ず,できればビット演算のみで)求める方法を探しているのですが,そういうア
ルゴリズムご存じの方いらっしゃらないでしょうか?
言語は C です.

よろしくお願いします.
2進数で表現したときに、最下位ビットを0番としてa番目だけが1になる数です

答書いちゃうけど
unsigned int flp32(unsigned int x) {
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x - (x >> 1);
}


機種依存の方法を使うなら、組み込みのビットスキャンを使うなり、
浮動小数にキャストしてSIMDレジスタ上でごにょごにょ(ry
867デフォルトの名無しさん:2006/08/08(火) 23:28:23
>>866
有り難うございます.元スレでもどうようの答えをいただけました.

>浮動小数にキャストしてSIMDレジスタ上でごにょごにょ(ry

指数部を取り出すということだと思ったのですが,ここで SIMD レジスタが出
てくるのは何ででしょうか?よろしければご教授ください.
特に意味はないが、SSEならビットマスク演算が使えるから。
仮数部に相当する23bitをマスクしてゼロクリアしてしまってから整数に戻す手もある。
869デフォルトの名無しさん:2006/08/09(水) 00:54:26
>>868
有り難うございます.元スレでもどうようの答えをいただけました.
870デフォルトの名無しさん:2006/08/09(水) 21:29:51
x86 なら BSR 命令で a を出すだろな

DSPとかにも、BSRのような命令はある。
浮動小数点への変換とか圧縮とかに便利だから。

でもBSRって書くと、どうもサブルーチンコール命令に勘違いしてしまうから嫌だな
871デフォルトの名無しさん:2006/08/20(日) 09:24:06
あげ
872デフォルトの名無しさん:2006/08/25(金) 21:44:23
>>835, 836
一連の反転値数列が欲しい場合は、

///////////////////////////////
n = 1 << 5;
j_rev[0] = 0;
i=0;
for( j=1; j < n-1; j++ ){
for( k=n>>1; k > (i^=k); k>>=1 );
j_rev[j] = i;
}
j_rev[n-1] = n-1;
//////////////////////////////////

これで、j_rev[b10011] = b11001
のようになります。
今日、fft の勉強しててやり方を知りました。
873デフォルトの名無しさん:2006/08/26(土) 22:28:57
オセロの盤面を白黒2つの64ビット整数で表して(bitboard)、
黒石の打てる箇所をビット演算で求めたいのですが、どうしたらいいですか?
874デフォルトの名無しさん:2006/08/26(土) 22:35:42
白も黒もビットが立っている事はありえないなら空いてる場所はxorで0のビット
ルールに則って打てる場所なら_
875デフォルトの名無しさん:2006/08/26(土) 23:17:41
http://www.radagast.se/othello/bitmob.c

↑にZebraのソースコードが公開されているのですが、何がなにやらよくわりません
876デフォルトの名無しさん:2006/08/27(日) 09:02:13
黒石を打って、右方向に白石を1個だけ返せるのは、空白黒 というパターンなので、
黒石のbitboardを black_board, 白石のを white_board とすれば、以下のようになる

blank = ~(black_board | white_board); // 空白の箇所
t = (blank >> 1) & white_board & 0x7f7f7f7f7f7f7f7f; // 空白 のパターン
t = (t >> 1) & black_board & 0x7f7f7f7f7f7f7f7f; // 空白黒 のパターン
mobility = t << 2; // 右方向に1個返せる箇所

これであってる?
877デフォルトの名無しさん:2006/08/27(日) 09:19:53
右方向に打てる場所のビットを探すのであれば、右の黒石からスタートした方が、最後のシフトが不要になる。

t = (black_board << 1) & white_board & 0xfefefefefefefefe; // 白黒 のパターン
blank = ~(black_board | white_board); // 空白の箇所
mobility = blank & (t << 1) & 0xfefefefefefefefe; // 右方向に1個返せる箇所
878デフォルトの名無しさん:2006/08/27(日) 09:31:43
コードを見やすくするために左移動を
inline uint64 move_left(b) { return (b<<1)&0xfefefefefefefefe; }
と定義しておく。
1方向に返る石の数は最大6個なので、右方向の処理は以下のようになる

t1 = white & move_left(black); // 白黒 のパターン
t2 = white & move_left(t1); // 白白黒 のパターン
t3 = white & move_left(t2); // 白白白黒 のパターン
t4 = white & move_left(t3); // 白白白白黒 のパターン
t5 = white & move_left(t4); // 白白白白白黒 のパターン
t6 = white & move_left(t5); // 白白白白白白黒 のパターン
blank = ~(black | white); // 空白の箇所
mobility = blank & move_left(t1 | t2 | t3 | t4 | t5 | t6); // 右方向に返せる箇所

あとはこれを残りの7方向についてやればおけ?
879デフォルトの名無しさん:2006/08/27(日) 11:25:28
w = white & 0x7e7e7e7e7e7e7e7e;
t = w & (black << 1);
t |= w & (t << 1);
t |= w & (t << 1);
t |= w & (t << 1);
t |= w & (t << 1);
t |= w & (t << 1);
blank = ~(black | white); // 空白の箇所
mobility = blank & (t << 1);

もうちょっとすっきりしたかな?
合ってる?
880デフォルトの名無しさん:2006/08/27(日) 13:03:20
すばらしい>>879

>>878 と比べると
・ 論理積演算が1回で済んでいる
・ 使用する変数の数が減っているので、アセンブラにするときに都合がよい
・ 0x7e...7e と 論理積をとっているので、逆方向の処理についてもこの結果が使用できる
というアドバンテージがある

念のために、8ビットの全パターンについてプログラムを組んで動作を確認してみたところ、
878 と 879 は同じ結果を返した。
なので、879 は合ってるようだ
881デフォルトの名無しさん:2006/08/27(日) 13:16:49
着手可能箇所のリストアップはできたので、今度は指定場所に黒石をおいたときに、
白石を反転させて、盤面を更新したい。
どう書いたらいい?

打つ場所は、Bitboard で表したときに1が立っているビットの位置(0..63)で指定するものとする。
int pos;
これをbitboradパターンに変換するために Bitboard set_mask[64] という変換テーブルが既に
用意されているものとする
882デフォルトの名無しさん:2006/08/27(日) 13:29:45
先読みの処理は、以下のような感じに書ける

Bitboard mobility = getMobility(black, white); // すべての着手可能箇所を取得
while( mobility != 0 ) {
 int pos = getFirstOne(mobility); // ビット値が1の一番下の位置を返す
 Bitboard rev = getRevBlack(black, white, pos); // pos に黒石を打ったときに反転する白のパターンを取得
 Bitboard m = (1<<pos); // 着手位置のビットパターン
 black |= m | rev; // 黒石を更新
 white ^= reb; // 白石を更新
 // なんらかの処理
 black ^= m | rev; // 黒石を元に戻す
 white ^= reb; // 白石を元に戻す
 mobility ^= m;
}
883デフォルトの名無しさん:2006/08/27(日) 14:58:09
ビット演算で、それが意図通りに動く事を証明する道具的な学問はなんですか?
884デフォルトの名無しさん:2006/08/27(日) 21:47:54
[華麗にスルー]


      三三三 >>883
                    三三三 >>883
         _ ∩
      ⊂/  ノ )             三三三 >>883
      /   /ノノノ     三三三 >>883
      し'⌒∪
885デフォルトの名無しさん:2006/08/27(日) 21:57:49
ブール代数、論理学 かな?
と答えてみる
886デフォルトの名無しさん:2006/08/27(日) 22:54:15
Bitboard m に黒石を打ったときに、反転する白石のパターンを取得する処理
まずは1方向のみ&ループを使ったコード:(m に着手可能なのは次善にチェック済みとする)

Bitboard rev = 0;
Bitboard mask = m;
for(;;) {
 mask >>= 1;
 if( (mask & black) != 0 ) break;
 rev |= mask;
}

さあ、ループを無くすことができるか?
887デフォルトの名無しさん:2006/08/27(日) 23:00:38
おおっと、その方向に着手可能かどうかは保障されてないので、
>>886 のコードではまずいぞ
888デフォルトの名無しさん:2006/08/27(日) 23:45:33
着手可能箇所を調べるときに、8方向について計算し、その論理和をとるわけだが、
それぞれの方向の値を保持しておけば、特定の方向に返るかどうかがわかる。
そうであれば、>>886 のコードでも大丈夫だ
889デフォルトの名無しさん:2006/08/28(月) 12:38:49
>>879>>878 が何故同じ結果を返すのかよくわからなかったけど、
シフトと論理和が分配法則をみたし、論理和が重複法則を満たすからなんだね

(x | y) << 1 == (x << 1) | (y << 1) // 分配法則
x | y | y == x | y // 重複法則
890デフォルトの名無しさん:2006/08/30(水) 21:27:30
8x8 のビットパターンが32ビットレジスタに入っているとき、
これを高速に90度回転するにはどうしたらいいんですか?
891デフォルトの名無しさん:2006/08/30(水) 21:28:55
ごめん、32ビットレジスタには8x8は入りきらない

32ビットレジスタ2つ、または64ビットレジスタに入っているものとします
892デフォルトの名無しさん:2006/08/30(水) 21:29:16
Σ (゚Д゚;)
893デフォルトの名無しさん:2006/08/30(水) 22:48:16
>>890
首を90度曲げる
894デフォルトの名無しさん:2006/08/30(水) 22:51:01
100年に一度の鬼才
895デフォルトの名無しさん:2006/08/30(水) 23:17:13
>>893-894
少々馬鹿な方法でやろうが、CPUがその程度の処理をこなす速度に
人間が首を曲げる速度で対抗できるわけがなかろうが。
SSEが使えるならpsllq & pmovmskb使うのが一番速そうだけど

とりあえず汎用性のあるのは

uint64 a[256] ;
memset(a, 0, sizeof(a);
for ( int i = 0; i < 256; i++ ) for ( int j = 0; j < 8; j++ ) a[i] += (i & (1 << j)) << (7 * j);

//↑ここまではあらかじめ計算しておく

reg = a[reg & 0xFF] | (a[(reg >> 8) & 0xFF] << 1) | (a[(reg >> 16) & 0xFF] << 2)
| (a[(reg >> 24) & 0xFF] << 3) | (a[(reg >> 32) & 0xFF] << 4) | (a[(reg >> 40) & 0xFF] << 5)
| (a[(reg >> 48) & 0xFF] << 6)| (a[reg >> 56] << 7);
897デフォルトの名無しさん:2006/08/30(水) 23:23:53
>>890
一応、ハッカーの楽しみを読めば乗っているよ。

typedef unsigned long long ulong;
ulong rotate(ulong x){
    x =
        x << 1 & 0xAA00AA00AA00AA00ULL |
        x >> 1 & 0x0055005500550055ULL |
        x >> 8 & 0x00AA00AA00AA00AAULL |
        x << 8 & 0x5500550055005500ULL ;
    
    x =
        x << 2 & 0xCCCC0000CCCC0000ULL |
        x >> 2 & 0x0000333300003333ULL |
        x >> 16& 0x0000CCCC0000CCCCULL |
        x << 16& 0x3333000033330000ULL ; 
    
    x =
        x << 4 & 0xF0F0F0F000000000ULL |
        x >> 4 & 0x000000000F0F0F0FULL |
        x >>32 & 0x00000000F0F0F0F0ULL |
        x <<32 & 0x0F0F0F0F00000000ULL ;
    return x;
}
memset(a, 0, sizeof(a) );

と。。。

論理和・論理積・シフト演算の優先順位ってどうだったっけ?
899デフォルトの名無しさん:2006/08/30(水) 23:39:43
>>898
シフト演算は、加減算のすぐ下、各種論理演算よりは上。

論理和と論理積では論理積の優先順位が高い。
通常の和と積では、積の優先順位が高いのと同じ。
900デフォルトの名無しさん:2006/08/30(水) 23:39:52
優先度の高い順に並べるとこう >> , & , |

論理積と論理和の優先順位の並びは算数の積と和の優先順位と同じ並びかたで、
なおかつシフトより優先度が低い。
自分はこの辺体にしみついちゃってるから結構()は省きがち。
901デフォルトの名無しさん:2006/08/30(水) 23:58:31
>>897
何で、これで回転できるの?
さぱーりわからん
902897:2006/08/31(木) 00:11:48
>>901
分割統治方をつかってますです。

最初は2*2の回転。
次は4*4の回転。既に4*4の中身の2*2の回転は済んでいるので外側だけの回転。
最後は8*8の回転。既に8*8の中身の4*4の回転は済んでいるので外側だけの回転。

とりあえず、下は4*4だけどこんな感じに回転する。
1234
5678
ABCD
EFGH
 ↓2*2の回転
2648
1537
BFDH
AECG
 ↓4*4の回転
48DH
37CG
26BF
15AE
903デフォルトの名無しさん:2006/08/31(木) 08:12:35
>>897
転置してバイトオーダを入れ替える方が速くないかい?

uint64 rotLeft90(uint64 x)
{
uint64 t = ((x >> 7) ^ x) & 0x00aa00aa00aa00aa;
x = x ^ t ^ (t << 7);
t = ((x >> 14) ^ x) & 0x0000cccc0000cccc;
x = x ^ t ^ (t << 14);
t = ((x >> 28) ^ x) & 0x00000000f0f0f0f0;
x = x ^ t ^ (t << 28);
return byteSwap(x);
}

こっちは (シフト演算*2 + 論理演算*4) * 3 + byteSwap
byteSwap は x86 の bswap を使えば4命令でできる

>>897 は (シフト演算*4 + 論理演算*7) * 3
904デフォルトの名無しさん:2006/08/31(木) 08:57:14
実際にプログラムを書いて、回転関数を1億回コールした場合の時間を計測してみた
@Athlon 64 2.0GHz

>>897 は 5.55秒
>>903 は 3.45秒 (byteSwap() の部分を __asm で記述した)

905デフォルトの名無しさん:2006/08/31(木) 09:08:25
>>896 は、そのままだとコンパイルエラーになる
memset の閉じカッコが抜けている

しかも、テストプログラムを実行すると正しい値を返さなかった
906デフォルトの名無しさん:2006/08/31(木) 09:18:19
>>896 は正しい値を返さないが、とりあえず実行速度を計ってみた

2.53秒/1億回ループ

デバッグすると遅くなるかもしれんが、今は速いぞ
907デフォルトの名無しさん:2006/08/31(木) 09:54:53
テーブルを使う版を書いてみた。テストプログラムで動作確認済み

static uint64 g_rotTable[256];
void setup_rotTable()
{
//ix のビットパターンを左回転させたものを g_rotTable[ix] に格納
for(int ix = 0; ix < 256; ++ix) {
uint64 v = 0;
uint64 vm = 0x0100000000000000;
for(int mask = 1; mask < 0x100; mask <<= 1, vm >>= 8) {
if( (ix & mask) != 0 )
v |= vm;
}
g_rotTable[ix] = v;
}
}
uint64 rotLeft90_table(uint64 x)
{
uint64 t = g_rotTable[x & 0xff];
t |= (g_rotTable[(x >> 8) & 0xff] << 1);
t |= (g_rotTable[(x >> 16) & 0xff] << 2);
t |= (g_rotTable[(x >> 24) & 0xff] << 3);
t |= (g_rotTable[(x >> 32) & 0xff] << 4);
t |= (g_rotTable[(x >> 40) & 0xff] << 5);
t |= (g_rotTable[(x >> 48) & 0xff] << 6);
t |= (g_rotTable[(x >> 56) & 0xff] << 7);
return t;
}
908デフォルトの名無しさん:2006/08/31(木) 10:04:13
んで、1億回ループさせて時間を計測すると

5.09秒

>>903 より全然遅い
それぞれの演算数を比べると以下のとおりだ

>>907 : 5.09秒 シフト演算 * 14 + 論理演算 * 15 + 配列によるメモリアクセス * 8
>>897 : 5.55秒 シフト演算 * 12 + 論理演算 * 21
>>903 : 3.45秒 シフト演算 * 6 + 論理演算 * 12 + byteSwap (アセンブラ4命令)

>>907 のコードだとメモリは食うし遅いしで、いいこと無いね

>>896 に書いてある「汎用性のある」とはどういう意味だ?
909デフォルトの名無しさん:2006/08/31(木) 10:17:13
団子の妄言は気にすんな
910デフォルトの名無しさん:2006/08/31(木) 10:20:14
>>895
相当広い面積になった場合は首を曲げるほうが早いけどな
911デフォルトの名無しさん:2006/08/31(木) 10:26:58
>>909 了解

ところで、時間計測は Athlon 64 2.0Ghz WinXP VC6 32ビットモードで計測している
VC6 の __int64 のシフト演算はサブルーチンコールになるので、非常に遅い
Athlon 64 の64ビットモードでコンパイルするとかなり高速になりそうだ

それと >>907 のコードはシフト処理を減らせばもっと高速になるはず

912デフォルトの名無しさん:2006/08/31(木) 10:47:20
64ビットシフトをほとんど無くしてみた

uint64 rotLeft90_table(uint64 x)
{
uint32 hi = (uint32)(x >> 32);
uint32 low = (uint32)x;
uint64 t =g_rotTable[(uchar)(hi >> 24)];
t = t + t | g_rotTable[(uchar)(hi >> 16)];
t = t + t | g_rotTable[(uchar)(hi >> 8)];
t = t + t | g_rotTable[(uchar)hi];
t = t + t | g_rotTable[(uchar)(x >> 24)];
t = t + t | g_rotTable[(uchar)(x >> 16)];
t = t + t | g_rotTable[(uchar)(x >> 8)];
t = t + t | g_rotTable[(uchar)x];
return t;
}

しかし、処理時間は 6.69秒/1億回ループ と逆に増えてしまった。
何故だろう?

結局テーブルを用いる方法はテーブルアクセスが頻繁になりバス幅を使い切ってしまうので
よろしくない、ということなのかなぁ
913デフォルトの名無しさん:2006/08/31(木) 10:47:56
64ビットシフトならInt64ShrlMod32とかはどう?
ヘッダ見る限り、インラインアセンブリで書いているようだけど。
914デフォルトの名無しさん:2006/08/31(木) 19:01:28
> SSEが使えるならpsllq & pmovmskb使うのが一番速そうだけど
妄言のような気もするが、念のために MMX を使用した版も作ってみた。
アルゴリズムは最速の 転置を行って、バイトスワップをするのを使用
処理時間は 3.16秒/1億回ループ と期待したほどには高速化されなかった

uint64 rotLeft90_MMX(uint64 x)
{
__asm {
movq mm0, x

movq mm2, td_00aa00aa00aa00aa
movq mm1, mm0
psrlq mm1, 7
pxor mm1, mm0
pand mm1, mm2
pxor mm0, mm1
psllq mm1, 7
pxor mm0, mm1

=== 長いので省略 ===

movq x, mm0
mov edx, long ptr x ; 上下32ビット反転
mov eax, (long ptr x) + 4
bswap edx
bswap eax
}
}
915デフォルトの名無しさん:2006/08/31(木) 20:38:31
ulong
r (ulong x)
{
unsigned int a, b, c, d;
unsigned int y[2];

asm volatile ("movq %0, %%mm0" : : "m" (x));
asm volatile ("pmovmskb %%mm0, %0" : "=g" (a) :);
asm volatile ("psllq $1, %mm0");
asm volatile ("pmovmskb %%mm0, %0" : "=g" (b) :);
asm volatile ("psllq $1, %mm0");
asm volatile ("pmovmskb %%mm0, %0" : "=g" (c) :);
asm volatile ("psllq $1, %mm0");
asm volatile ("pmovmskb %%mm0, %0" : "=g" (d) :);
y[0] = a | (b << 8) | (c << 16) | (d << 24);
asm volatile ("psllq $1, %mm0");
asm volatile ("pmovmskb %%mm0, %0" : "=g" (a) :);
asm volatile ("psllq $1, %mm0");
asm volatile ("pmovmskb %%mm0, %0" : "=g" (b) :);
asm volatile ("psllq $1, %mm0");
asm volatile ("pmovmskb %%mm0, %0" : "=g" (c) :);
asm volatile ("psllq $1, %mm0");
asm volatile ("pmovmskb %%mm0, %0" : "=g" (d) :);
y[1] = a | (b << 8) | (c << 16) | (d << 24);

return y[0] | ((ulong) y[1] << 32);
}
pmovmskb使ったのってこういうのだと思ったけどコンパイラの最適化にかなりたよった
これより速いの書けなかった
ちなみに>>897のが5.96秒でこれが3.41秒だった
916デフォルトの名無しさん:2006/08/31(木) 21:13:26
ビット演算で使えるのは、
and, or, xor (not)
right shift, left shift
ほかにある?ローテートとかもOK?
一応、addやmulとかもビットの演算にすぎないんだけど・・
917デフォルトの名無しさん:2006/08/31(木) 21:31:37
ううう、VC6 __asm では pmovmskb がサポートされていないみたいだ _| ̄|○
918デフォルトの名無しさん:2006/08/31(木) 21:33:29
>>916 すべての演算はビット演算だ
ただし、mul や div は論理演算に比べると実行速度が遅いので、
それを補って余りあるメリットがなければ使用しない方がよろし

>>915
1ビット左シフトはユニットの空きを考慮して適宜同一レジスタ間の加算で代用するのは常識
あと、SIMD整数ユニットは大概2本あり、AMDのSIMDはLatencyが大きいのでその辺も考慮されたい。

movq mm0, mmword ptr [src]
pmovmskb eax, mm0
mov byte ptr [dest + 7], eax
movq mm1, mm0
paddb mm0, mm0
psllq mm1, 4
pmovmskb edx, mm1
mov byte ptr [dest + 3], edx
paddb mm1, mm1
pmovmskb eax, mm0
pmovmskb edx, mm1
mov byte ptr [dest + 6], eax
mov byte ptr [dest + 2], edx
paddb mm0, mm0
paddb mm1, mm1
pmovmskb eax, mm0
pmovmskb edx, mm1
mov byte ptr [dest + 5], eax
mov byte ptr [dest + 1], edx
paddb mm0, mm0
paddb mm1, mm1
pmovmskb eax, mm0
pmovmskb edx, mm1
mov byte ptr [dest + 4], eax
mov byte ptr [dest], edx

つーか、全てにおいて最適なスケジューリングなんてねーだろよ

何も出来ないゴミが喚いても無駄

921デフォルトの名無しさん:2006/08/31(木) 23:11:23
AMDはGPR <=> FPRの転送遅いよ
レジスタファイルもパイプラインも離れた配置になってるからね。
並列化してレイテンシを隠蔽すればいい。

pmovmskbはP6系アーキでもレイテンシ3くらいだったと思う。
923デフォルトの名無しさん:2006/09/01(金) 00:02:28
んで、>>919 は1億回コールすると何秒かかったんだ?
試せよ屑
925デフォルトの名無しさん:2006/09/01(金) 00:04:18
団子リオンってなに?
センスを感じない
926デフォルトの名無しさん:2006/09/01(金) 00:10:10
ulong r (ulong x) {
ulong y;
asm volatile ("movq %0, %%mm0" : : "m" (x));
asm volatile ("pmovmskb %mm0, %eax");
asm volatile ("movb %%al, %0" : "=m" (((unsigned char *) &y)[0]) :);
asm volatile ("movq %mm0, %mm1");
asm volatile ("paddb %mm0, %mm0");
asm volatile ("psllq $4, %mm1");
asm volatile ("pmovmskb %mm1, %edx");
asm volatile ("movb %%dl, %0" : "=m" (((unsigned char *) &y)[4]) :);
asm volatile ("paddb %mm1, %mm1");
asm volatile ("pmovmskb %mm0, %eax");
asm volatile ("pmovmskb %mm1, %edx");
asm volatile ("movb %%al, %0" : "=m" (((unsigned char *) &y)[1]) :);
asm volatile ("movb %%dl, %0" : "=m" (((unsigned char *) &y)[5]) :);
asm volatile ("paddb %mm0, %mm0");
asm volatile ("paddb %mm1, %mm1");
asm volatile ("pmovmskb %mm0, %eax");
asm volatile ("pmovmskb %mm1, %edx");
asm volatile ("movb %%al, %0" : "=m" (((unsigned char *) &y)[2]) :);
asm volatile ("movb %%dl, %0" : "=m" (((unsigned char *) &y)[6]) :);
asm volatile ("paddb %mm0, %mm0");
asm volatile ("paddb %mm1, %mm1");
asm volatile ("pmovmskb %mm0, %eax");
asm volatile ("pmovmskb %mm1, %edx");
asm volatile ("movb %%al, %0" : "=m" (((unsigned char *) &y)[3]) :);
asm volatile ("movb %%dl, %0" : "=m" (((unsigned char *) &y)[7]) :);
return y;
}
これだと3.57秒で>>915のよりちょっとだけ遅かった
CPUによって全然違うと思うけど
自分のはペンティアム3
927デフォルトの名無しさん:2006/09/01(金) 00:16:35
単発でx秒だったとか言われても
同一環境で試した他の結果も一緒に貼らんと無意味
928デフォルトの名無しさん:2006/09/01(金) 00:21:26
他のも>>915に書いたよ
929デフォルトの名無しさん:2006/09/01(金) 00:26:32
・・・
Pen3だとFPshiftとFPmiscが別ユニットだからどのみち並列動作可能なのか。。。
931デフォルトの名無しさん:2006/09/01(金) 11:54:20
>>925
キチガイ構っちゃ駄目。
932デフォルトの名無しさん:2006/09/01(金) 12:01:52
知識で劣勢になると人格攻撃しか出来ない
933デフォルトの名無しさん:2006/09/01(金) 12:39:41
まあそういうこともあるけど、団子はもっと別のところに原因があるだろ?
出てくるたびにトラブルを引き起こすのは何故か考えてみたら?
934デフォルトの名無しさん:2006/09/01(金) 13:23:04
>>932 もダンゴの別人格か?いったい何重分裂なんだ。
935デフォルトの名無しさん:2006/09/01(金) 13:59:08
936デフォルトの名無しさん:2006/09/01(金) 16:09:32
>>932
奴の知識と経験に疑いはない。
ただキチガイだと言っている。
937デフォルトの名無しさん:2006/09/01(金) 21:35:31
回転問題で忘れられているオセロ
g_plus1[pos] にpos (0..63) の位置から盤の右端までビットを立てたテーブルをあらかじめ作っておけば、
int pos に黒石を置いたとき、右方向に返る白石は以下のようにして取得できると思う

uint64 nwh = ~(white & 0x7e7e7e7e7e7e7e7e);
uint64 rev = 0, m;
if( (m = g_plus1[pos] & nwh & black) != 0 )
 rev |= g_plus1[pos] ^ m ^ g_plus1[getLSSetBit(m)];

getLSSetBit(uint64) は一番下位のセットされたビットのビット番号を返す関数
x86 であれば BSF 命令を使用すれば高速に処理できる

こんなんでどうでしょうか?
938デフォルトの名無しさん:2006/09/02(土) 01:34:20
いやぁ経験も怪しいもんだ世
939デフォルトの名無しさん:2006/09/02(土) 06:27:21
そんなに協調性がないなら唯我独尊で自分一人だけで居りゃいいのに
なんでわざわざ出しゃばってくるのか解らんよ。
940デフォルトの名無しさん:2006/09/02(土) 10:07:15
>>937
最後の行の真ん中に人がいる w
941デフォルトの名無しさん:2006/09/02(土) 10:08:09
コンパイルエラーの出るコードや、正しく動作しないコードを晒している時点で問題外だと思う
942デフォルトの名無しさん:2006/09/02(土) 12:56:52
オセロの話

オセロでは、絶対に返されることのない石を「確定石」といいます。
隅の石は無条件で確定石ですし、辺がすべて埋まっているときの辺の石はすべて確定石です。
確定石の個数と有利さには大きな相関があります。

しかし、確定石を計算するのは大きなコストがかかるので、オセロプログラムでは通常「準確定石」を計算します。
準確定石とは一回で返されることの無い石のことです。

uint64 rev = 0;
uint64 mobility = getMobility(black, white);
for(uint64 m = すべての可能な着手について)
rev |= getRevPat(black, white, m);
uint64 semiFixed = white ^ rev;

とすれば、白の準確定石を計算できますが、時間がかかりそうです。
ビット演算を駆使して準確定石を高速に計算するにはどうしたらいいでしょうか?
943調べ物中の通りすがり:2006/09/02(土) 21:06:25
dual program 方式を使ってはどうでしょうか??
コストを低くすることができると思いますよ。
dual program を使うときは interrup のプログラムを実行しないのであれば tmemory protection のプログラム確認を厳にした方がいいですね。
↑大学で習ったばかりなのでここに直接打ち込めなくてスミマセン(汗)
944デフォルトの名無しさん:2006/09/02(土) 21:59:38
>>940
( ^ m ^)どこにいるかわかんないお
945デフォルトの名無しさん:2006/09/06(水) 19:45:48
8x8 ビットのデータが64ビット変数に入っています。これを45度回転させて、64ビッドにつめこみたい

63 62 61 60 59 57 57 56
55 .....
....
07 06 05 04 03 02 01 00



63
55 62
47 54 61
...
01 08
00

これをビット演算を使って高速に処理するにはどうしたらいいのでしょうか?
946デフォルトの名無しさん:2006/09/06(水) 19:47:36
ご祝儀あげ
947デフォルトの名無しさん:2006/09/06(水) 20:55:16
ビット演算は美学
948デフォルトの名無しさん:2006/09/07(木) 10:33:18
>>945
64ビッドは難しいな。

…つか、45度傾けた正方形は
元の正方形の70%に縮小しなきゃいけないのは判ってる?
949デフォルトの名無しさん:2006/09/07(木) 12:47:32
>>948
「45度回転させて、64ビッドにつめこみたい」の意味がわかる?

正確な図は http://www.cis.uab.edu/info/faculty/hyatt/bitmaps.html
Figure 6. を見てくれ
950デフォルトの名無しさん:2006/09/07(木) 13:13:00
Fig6 の結果を 8x8 の器の中にそのまま詰め込むには無理ないか?
951デフォルトの名無しさん:2006/09/07(木) 14:47:38
>>949
いや、「64ビッド」がわからん
952デフォルトの名無しさん:2006/09/07(木) 14:57:25
それ以前に俺には8x8バイトのデータに見える。
953デフォルトの名無しさん:2006/09/07(木) 15:05:39
8x8のバイトデータなら 値の割り当ての際に補間つかえるな

45度単純回転入れ替えを 偶数x偶数空間でどうやるのか見当もつかん
奇数x奇数ならやりようはありそうだけど
123 412
456 753
789 896
954デフォルトの名無しさん:2006/09/08(金) 21:13:43
>>950
多少無理があっても、無理やり64ビットに詰め込むんだ
955デフォルトの名無しさん:2006/09/08(金) 21:20:56
64ビットに8x8(=64)の情報を入れるためには、
その情報は1ビットの情報量しかないことになる。
で、果たして1ビットの情報を扱うことに意味があるのか?
956デフォルトの名無しさん:2006/09/08(金) 21:33:14
>>955
まじレスすると、以下のURLでも読んで勉強しろ
http://www.cis.uab.edu/info/faculty/hyatt/boardrep.html
http://www.cis.uab.edu/info/faculty/hyatt/bitmaps.html
957デフォルトの名無しさん:2006/09/08(金) 23:56:41
958デフォルトの名無しさん:2006/09/09(土) 09:17:34
おまいら早く45度回転プログラム書いてください
959デフォルトの名無しさん:2006/09/11(月) 00:14:05
首を45℃傾ければプログラム不要
960デフォルトの名無しさん:2006/09/11(月) 00:25:18
画面を45℃傾けるほうが健康に良い
961デフォルトの名無しさん:2006/09/11(月) 00:58:31
>>959-960
45℃傾けるってどういうことですか?
温度で角度はしていできません。
962デフォルトの名無しさん:2006/09/11(月) 12:48:19
ヒント:温度勾配
963デフォルトの名無しさん:2006/09/11(月) 13:04:26
温度と確度の変換はサノバビッチ公式を展開して出すんだよ
964デフォルトの名無しさん:2006/09/11(月) 13:09:17
殿専用か?
965デフォルトの名無しさん:2006/09/11(月) 13:09:18
温度と確度なら量子波動方程式になるんじゃ?
966デフォルトの名無しさん:2006/09/12(火) 00:48:50
>>959-960
ハードウェアエンコーディングキタコレ!
967デフォルトの名無しさん:2006/09/12(火) 09:27:55
画面2個並べて首を傾ければ
並列処理だぜ!
968デフォルトの名無しさん:2006/09/12(火) 17:31:49
すげー
おまえらてんさいだな!
969デフォルトの名無しさん:2006/09/14(木) 11:46:28
符号無4バイト整数変数xに2のn乗が入っているときに、
エレガントにnを求める方法ありますか?
(a) 2^0 から 2^31 まで順番に比較していく
 → 簡単だけど...
(b) 二分探索
 → 最大5回も分岐するのでエレガントとは思えない。
他にもっといい方法があれば教えて。
970デフォルトの名無しさん:2006/09/14(木) 12:06:32
>>969
"\0\0\1\32\2\27\33\0\3\20\30\36\34\13\0\15\4\7\21\0\31" 
"\26\37\17\35\12\14\6\0\25\16\11\5\24\10\23\22"[i%37u];

>>377あたりで同じ話題出てるからその辺みるよろし。
971969:2006/09/14(木) 12:08:44
>>377 あたりで既出でした。ごめんなさい。
972デフォルトの名無しさん:2006/09/14(木) 12:19:12
複数個のnビットデータから最小の値のデータを選び出すには、
どういう考え方(アルゴリズム?)で記述すればいいでしょう?
973デフォルトの名無しさん:2006/09/14(木) 14:41:22
次スレ必要ならこれテンプレに入れとこ
ttp://www.nminoru.jp/~nminoru/programming/bitcount.html

>>972
全データがレジスタ1個か2個に収まるようなビット配列なら
議論の余地はあるが、基本的に線形探索だな。

minVal = data[0];
for(int i=1; i < data.size(); i++) {
minVal = (data[i] < minVal)? data[i] : minVal;
}
974デフォルトの名無しさん:2006/09/14(木) 18:50:09
975デフォルトの名無しさん:2006/09/15(金) 12:48:17
問題:
32ビット変数の下位27ビットにデータが入っています。このビットオーダを反転させるにはどうしたらいいでしょうか?

例:000001100111....0101 → 000001010...1110011

976デフォルトの名無しさん
マスクとって反転して上位だけマスクしたやつとOR