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


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

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



1 名前:デフォルトの名無しさん [2006/09/16(土) 09:46:26 ]
前スレ
ビット演算
pc8.2ch.net/test/read.cgi/tech/1123918075/


関連スレ
アセンブラ… (゜□゜) ↑アッー!↓
pc8.2ch.net/test/read.cgi/tech/1148402614/


関連情報
Hacker's Delight
ttp://www.hackersdelight.org/

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか
ttp://www.amazon.co.jp/exec/obidos/ASIN/4434046683

ビットを数える・探すアルゴリズム
ttp://www.nminoru.jp/~nminoru/programming/bitcount.html

Bitboard
ttp://en.wikipedia.org/wiki/Bitboard

809 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 23:10:51 ]
λ... PC-8001, PC8201, PC-6001, &c. ...

810 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 23:48:03 ]
獣の数字にまつわる屁理屈と同じようなもんだな
あえて8801に意味を見出すなら99*99-1100とかなんとか

811 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 23:49:53 ]
9801-1100 = 8701だな
俺頭大丈夫k

812 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 00:08:26 ]
PC9801が長いこと繁栄したのは99*99=9801
こういった力(ちから)を持つ数字が隠されていた影響に違いない。
その証拠に型番が9821に変わろうとしたとたん没落した。
きっと9801のままなら永遠の存在だったんだよ。

813 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 00:11:55 ]
>>798 そうか、9bitのハッシュのエレガントな解法だったのね。ごめん。
ハッシュって、必要の都度、bit数見極めて作らなきゃいけないんだな・・・

814 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 01:24:27 ]
実際に仕事でも使用可能な、
1.実用性がある
2.比較的わかりやすい
ビット演算のアルゴリズムって何だろうね・・・

815 名前:デフォルトの名無しさん [2008/08/04(月) 01:50:11 ]
名前がつくぐらい有名になればいいんじゃないかな。
例えばコメントに
// 762氏ハッシュ
とか書けるぐらいに。


816 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 01:56:23 ]
すみません、
>"\1\2\3\010\6\4\011__\7\5"[n*0x5300000>>28];
の頭の"\1\2\3\010\6\4\011__\7\5"がいまいち良くわかりません。


817 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 02:06:28 ]
ただの文字列リテラルだよ



818 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 02:06:59 ]
コメントに、「ハッシュがどうの」なんて書く奴ばっかだからダメなんだよ。
コメントに絶対に書かなきゃいけないのは、>>751-752だよ。
どういう実装をしたかのコメントなんて二の次三の次。

それなのに仕様のコメントを怠ったままで「すげーテクニック使ってるんだぜ」的なコメントを残しても意味なし。
そんなものを残すぐらいなら、(最低限の>>751-752の他に)assertでも使った範囲チェック入れとけ。

もちろん、>>762のやり方に対するコメント(完全ハッシュ関数とテーブル)はあった方が良い。
けど、仕様についてのコメントの方がはるかに重要。

819 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 03:06:57 ]
日本語でおk

820 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 03:45:03 ]
日本人でおk

821 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 04:32:52 ]
二本イレマスカ?

822 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 04:59:25 ]
イマレス

823 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 08:02:17 ]
#if 0 // オリジナルのロジック
...;
#else // 速度重視で書き換え
...;
#endif

824 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 08:15:04 ]
"..."[...]という書き方をこの流れで始めて知った

何でこのスレにいるかって?
知るために見ているのさ

825 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 09:53:07 ]
K&Rの頃のCをやってた人間からすれば常識

826 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 12:37:57 ]
>>816 文字リテラル "abc"とかならキャラ型の配列だって判るでしょ。
スペース(0x20)より小さい値のcharは 「\8進数」 で書く約束になってる。
"\1\2\3・・・"は、char xxx[ ]={ 1, 2, 3, ・・・, 0 };という配列が生成される。

827 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 13:33:40 ]
>>826
>スペース(0x20)より小さい値のcharは 「\8進数」 で書く約束になってる。
なってない。



828 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 17:24:05 ]
\001 \002 \017 とかだよ。 Hexの場合は \xhh と書く約束になってる。
俺のはLSIC85とか adUc51とか、クミコ系ばっかりで、ANSIは知らないけど。

829 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 18:13:00 ]
0x20以上の値で使ってはいけないという決まりもないわけで。

830 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 22:15:16 ]
最下位8bitについてなら左右を逆転するコードあった筈
こんな感じだったと思うけど、よく覚えてないや

x:src y:dest
s=(x*0x02020202)&0x84422010
t=(x<<3)&0x420
y=(s+t)%1023

831 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 22:49:39 ]
>>792で既出だべ。


832 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 23:59:20 ]
>>828
\n \t \r とかもあるわけで。

833 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 00:45:34 ]
>>832
は?

834 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 01:21:35 ]
文字リテラルが配列の名前???
どうも「文字リテラル+[]」が良くわからん。
ビット演算うんぬんではなく・・・
C言語でこれを書いてコンパイルが通るのか?

どうもこのスレに付き合うには、大学などできちんと学ぶか
元々、この手のことが好きじゃないとついていけませんね・・・

社会人になってから、プログラムを覚えたアホアホな俺の
プリンみたいな脳みそでは、だめかorz

835 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 01:37:17 ]
なんでワカラン??? 大学とか関係ないぞ。

char * buf = "01234567";
char a = buf[0];

が判れば、

char a = "01234567"[0];

だって判るだろ。


836 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 01:41:46 ]
char a = 0["01234567"];

こんなのもある。これが直感的に納得しづらいというのはワカランでもないけど、

char a = "01234567"[0];

こっちは普通だべ。


837 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 09:00:56 ]
>>834
>元々、この手のことが好きじゃないとついていけませんね・・・
当たり前だと思うんだが。



838 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 10:50:52 ]
文字列定数がメモリ空間に配置されている状態をイメージできていないんだな。
プロセスメモリエディタかバイナリエディタと睨めっこでもしてみればいいんじゃね。

839 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 12:25:02 ]
文字列リテラルは、コンパイラがDATAやTEXTのようなセグメントに配置して
プログラムの中に埋め込まれるちょっと特殊なchar[]にすぎん。
"hoge"とか書いた場合、これはそういう配列を暗黙にどっかに確保しろよと
コンパイラに言っているのと同時に、式の中で評価されるときは、その(無名の)
char配列の名前と同等に扱われる。

要はchar[]なのだから、char*な変数に文字列リテラルを代入したり
printf()のような関数に文字列リテラルを引数として渡したり、ということは
普通に・当然のようにやっているはずだ。
さすがにprintf("hello, world"); というコードを見たことが無いとは言わせない。

ならば、[]演算子を適用できるということも当然分かるはずだな。
多分、そういうコードを今まで見たことが無い、見慣れない、ってだけだろう。

840 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 12:32:50 ]
>>834
[]を特殊なものだと思うからいけない。ただの演算子だ。
a[b]とあったら必ず*(a+b)と置き換えが可能だから、ただのポインタ演算とデリファレンスに成り下がるだろ。
デリファレンスするために、aかbのどちらかはポインタでもう一方は整数でないといけないだけだ。

例えばchar a = 0["01234567"]とあったらchar a = *(0 + "01234567")になり、即ちchar a = *("01234567")であり、char a = "01234567"[0]だ。
これでも理解しにくかったら、全部一時変数にしてしまえばいい。
const char * p = "01234567"; int i = 0; として、char a = p[i]; ならわかるだろ。。

841 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 13:15:16 ]
おそらくは、
 配列の名前[インデックス]
のように教えてる参考書の類が悪いんだろう。

842 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 15:15:59 ]
>>834
このスレ開いただけでも望みはある!

843 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 18:04:55 ]
すごいな。叩きが日常の2chで、シロートにここまで優しいのは、久しぶりに見た。

844 名前:デフォルトの名無しさん [2008/08/05(火) 19:53:06 ]
>>838
メモリをイメージする訓練も大切だが、
もっと抽象的に捉える訓練も忘れないで欲しいな。


845 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 20:05:18 ]
そうだなー、最近そういうトレーニング怠ってるかも…俺。

846 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:13:44 ]
>>841
真の文法を書いてる本は稀少なのかね。

847 名前:デフォルトの名無しさん [2008/08/05(火) 21:27:48 ]
>>846
真の文法を書いている本でも、いでおしんくらてっぃくなところは
はしょっているか、読み取れないようにしてるのが多いと思う。
実際、俺なんか、
int typedef integer;
なんて構文が許されるなどとはイソターネットで初めて知った。




848 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:44:04 ]
なるほど、許されない理由がないから許されるんだな。

849 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:47:55 ]
もしかして:void main(void)

850 名前:デフォルトの名無しさん [2008/08/05(火) 22:11:34 ]
>>846
真の文法をサポートする本とはLinuxのことである。
Linux以外は紛い物である。

851 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 00:58:33 ]
>>833
いや、意味が理解できないなら別にいいんだ。

>>839-841
C/C++ に毒されすぎ (w

文字列と文字の配列が互換の言語はあまり多くないから、
"abcd"[0] を >>834 が奇異に感じるのも無理は無いよ。

852 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 00:59:35 ]
[]はmonadの一種でしょ

853 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 01:15:22 ]
みなさん、あほな俺に丁寧にありがとう。
さすがに理解できました。

>多分、そういうコードを今まで見たことが無い、見慣れない、ってだけだろう。
そうですね。はじめてみました。

なんかすっきりしました。
皆さんありがとうございました。

なんかビット演算って難しそうですけど、面白そうですね。
私も、最近処理速度を意識したコードを書く機会があるので
色々参考にします。
(クロックが25KHzなので、処理速度を意識しないといけないんですよ)



854 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 01:31:44 ]
ずいぶん遅くない? 8ビット機のときもMHzだったが。。。


855 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 09:28:35 ]
ケルビン・ヘルツという単位は寡聞にして知らない。

856 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 21:19:11 ]
>ずいぶん遅くない?
そうなんですよ。1サイクル40usなので、ビット操作(ビットクリアやビットセット)で
7サイクル取られるので、7*40=280us=0.28msもかかるんですよね・・・

857 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 21:30:37 ]
えー! そりゃ遅い。なんだろ。FPGAかなんかか。
最近は組み込みの分野でもJAVAだったりするが、まだまだCの出番はあるってことか。




858 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 22:00:42 ]
ボタン電池1個で半年動かすようなものなんじゃね?

859 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 22:06:20 ]
>>857
> まだまだCの出番はあるってことか。

て言うか、アセンブラの出番だと思うけど。

860 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 22:17:37 ]
Cで書く予定です。アセンブラでは保守のことを考えると難しいので。
如何にCで効率の良いコードを書くか。

クロックを遅くしているのは消費電流の低減のためです。
普段は32MHzで動作しますよ。

861 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:23:46 ]
>>767-768
ちょっと遅くなったが、求め方が解った。
今回は2^1〜2^9だからちょっと変則的なんだが、概念としてはM系列の応用みたい。
なるほどねー。
slashdot.jp/~Tellur52/journal/448479


862 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:25:18 ]
>>861
お前ここに糞スラのURL張るの禁止されていること
しらんのか?

863 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:27:12 ]
スラッシュドット禁止ってどんだけ情報弱者なんだよ。

え?あっちから拒絶してんの?


864 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 17:27:38 ]
あれ? 板ルール?
スマンかった。忘れて。


865 名前:861 mailto:sage [2008/08/09(土) 17:31:07 ]
>>863
あっちも出入りしているけど、そういうことはないと思う。
ここの板ローカルのルールなのかね?
ここも長年見ているが、あまり聞いたことないけど。


866 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 18:01:21 ]
>>862はさすがに釣りだろお前ら釣られ杉

867 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 18:40:27 ]
ぐぐってもあまりいいページがないんだが、どこかに解説ない?>M系列



868 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 02:54:03 ]
周期2^p-1ビットの列があって、そこからpビットを切り出すと、オール0以外の全てのパターンが現れる

p=3の場合のM系列は例えばこう。
0011101
↓ (周期2^3-1=7で同じパターンの繰り返し)
001110100111010011101...
上の桁から3ビットを切り出すと、
001 (1)
_011 (3)
__111 (7)
___110 (6)
____101 (5)
_____010 (2)
______100 (4)

1〜7まで全部出るだろ。これに000だけ追加すればおk。
これだけだと順番がバラバラなので、テーブルと組み合わせる。
↓この文字列リテラルの部分な。
"xxxxxxx"[(ハッシュ計算式)]
すると、>>762-763になりますよ、と。ビット溢れによるマスクなども組み合わせているが。

869 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 03:11:08 ]
任意の長さのシフトレジスタで適当なタップを選んでフィードバックすれば
最長系列(M系列)が得られるんだが,
このタップが整数論の方の原始多項式から求められるというのは覚えてる

870 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 16:08:47 ]
Cで保守の事を考えずに書いたときに保守しやすいのかといわれればもちろんNOだろ
素人が下手にCで最速コード書くと後で自分で読めないから、最初からアセンブリでやったほうがいいと思う

マクロが使えれば読みやすくなるのも事実だしな
MASMだと、アセンブリの癖にIFだのELSEだの使える。マクロがなければCでプリアセンブラを書けばいいし

871 名前:870 mailto:sage [2008/08/10(日) 16:10:30 ]
安価書き忘れ
>>860

872 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 17:38:03 ]
CPU換えたときの心配してるんだったらC

873 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 17:55:59 ]
スレタイも読めないバカが多いね。
移植性や保守性を犠牲にしてでも高速化しようってのが趣旨なのに。

874 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 18:16:42 ]
書かれてもいない事が見えるバカが居るんだね

875 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 18:25:56 ]
【高速化】ビット演算 0x02

876 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 18:31:54 ]
やばいですやばいです
ちょっと暴走して勃起が止まりません
リセットできないどうしよう

877 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 18:35:44 ]
適切な勃起フラグを提げろ。



878 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:02:20 ]
トシなのでフラグ立ちません! どうしよう!


879 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:20:29 ]
(´・ω・`)知らんがな

880 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:20:34 ]
> 移植性や保守性を犠牲にしてでも

そりゃビット演算すれば多少は移植性が犠牲になるだろうけど、
それだけならぜんぜん問題にはならない。
所詮フラグなんて1本しかないんだからな。
ただまあ、
大きさはいろいろだから互換性がない場合も確かにある。


881 名前:デフォルトの名無しさん [2008/08/26(火) 15:29:02 ]
 *     +    巛 ヽ
            〒 !   +    。     +    。     *     。
      +    。  |  |
   *     +   / /   イヤッッホォォォオオォオウ!
       ∧_∧ / /
      (´∀` / / +    。     +    。   *     。
      ,-     f
      / ュヘ    | *     +    。     +   。 +
     〈_} )   |
        /    ! +    。     +    +     *
       ./  ,ヘ  |      このスレッドは880を超えました。
 ガタン ||| j  / |  | |||        次レスも…BITクオリティ!!
――――――――――――         pc8.2ch.net/tech/


ああ暇だ

882 名前:デフォルトの名無しさん mailto:sage [2008/08/27(水) 20:01:38 ]
ちょっとリンク張らせてクレ。
science6.2ch.net/test/read.cgi/math/1209732803/
の427に問題を投稿したんで、暇ならチャレンジしておくれ。



883 名前:デフォルトの名無しさん mailto:sage [2008/08/27(水) 20:36:01 ]
算数得意だけど数学は苦手

884 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 14:51:58 ]
chessprogramming.wikispaces.com/Bitboards
ここまでくると、なにがなにやら

885 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:15:42 ]
簡単じゃん

886 名前:デフォルトの名無しさん [2008/09/13(土) 20:24:38 ]
(・∀・) ガッー

887 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 13:55:19 ]
発音できません><



888 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:19:16 ]
ん?ヌルポはどこ?


889 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:25:58 ]
>>888
888

890 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 16:29:38 ]
又ノレ木゚

891 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 16:31:31 ]
ガッ

892 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 17:12:10 ]
力゙っ

893 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 19:24:05 ]
>>890
その表記、キモすぎるw



894 名前:デフォルトの名無しさん [2008/09/27(土) 11:01:16 ]
整数間のキャスト演算について教えてください。
例えば、2の補数で表される4bitの値を8bitに変換する場合、

正の値: 0001 -> 0000 0001 # 最上位bitが0なら上位bitに0000を補う
負の値: 1110 -> 1111 1110 # 最上位bitが1なら上位bitに1111を補う

bit8 = (bit4 & 0x8) ? (bit4 | 0xF0) : bit4;

逆の変換は、

正の値: 0000 0001 -> 0001 # 上位4bitを削除
負の値: 1111 1110 -> 1110 # 上位4bitを削除

bit4 = bit8 & 0xF;

という考え方で合ってます?

895 名前:デフォルトの名無しさん [2008/09/27(土) 11:13:01 ]
合ってる。

896 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 11:29:26 ]
どうも

897 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2008/09/27(土) 12:16:50 ]
>>894
ARMならプレディケートに展開されるのでそれで十分速いんだが

欲をいえばこっちのほうが命令数とかレジスタ節約できるかもしれないね。
bit8 = bit4 | (bit4 & 0x8) ? 0xF0 : 0;

また、比較命令はall 1 か all 0のビットマスクを生成するタイプのCPUなら、
ビットマスクと0xF0との論理積をとるだけで加算する値を取得できる。


しかし、2項選択は多くのCPU分岐命令に一般的には遅い。
シフトが遅くないならこっちを試してもいい
bit8 = (signed char)bit4 << 4 >> 4;

現実には多くの32ビットCPUはレジスタサイズ未満のビット演算は遅いのでこっちのほうがいいかも
bit8 = (signed char)(((signed int)bit4 << 28) >> 28);

要はネイティブで算術シフト命令のできる最小単位ならなんでもいい。
同じロジックでbit16でもbit32でも展開できる。



898 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2008/09/27(土) 12:31:00 ]
しかし、2項選択は多くのCPUでは分岐命令に展開されるので一般的には遅い。



日本語しゃべれ俺

899 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 13:06:59 ]
> bit8 = bit4 | (bit4 & 0x8) ? 0xF0 : 0;

バグってるぞ。

900 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2008/09/27(土) 13:13:06 ]
bit8 = bit4 | ((bit4 & 0x8) ? 0xF0 : 0);

これでいいのか?

901 名前:894 mailto:sage [2008/09/27(土) 13:35:56 ]
なるほどsingned型って右シフトで上位ビットを補ってくれるのね。
CPUは普通のPCのIntel x86系です。

902 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2008/09/27(土) 13:49:08 ]
x86ならシフト使う方法のほうが有効だろうね(Pentium 4はシフト遅いけど)
bit4 = ecx
bit8 = eax

と仮定して

mov eax, ecx
sal eax, 28
sar eax, 28
and eax, 0xFF

たった4命令で済む。bit4を破壊していいなら3命令。

903 名前:デフォルトの名無しさん [2008/09/27(土) 19:47:32 ]
>>895
ちがうだろ
算術シフトか論理シフトかはコンパイラ依存

904 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 19:50:09 ]
100レスくらいで終わってもよさそうなのに実によく伸びるなこのスレ。

905 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2008/09/27(土) 22:02:58 ]
まあメジャーなコンパイラならsignedで算術シフトになるけどね。
//でコメントにならないコンパイラ並みには非互換問題あるのかな?

ローテートくらいまではC/C++標準仕様に入れておいて欲しいものだ

906 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:19:03 ]
分岐は

907 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:26:53 ]
>>903
> 算術シフトか論理シフトかはコンパイラ依存

負数の右シフトの動作のことを言ってるのか?

>> 2の補数で表される4bitの値を8bitに変換する場合

という条件下なら >>894 の内容に誤りはないと思うが。
そもそも、>>894 のレスにシフトのコードなんてないし。

# レスアンカーが >>897 なら同意するけど、あまり
# 触らない方がいいと思う。



908 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2008/09/27(土) 22:33:18 ]
もうこれでええやん
static const signed char table[] = { 0, 1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1 };

bit8 = table[bit4 & 15];

909 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:33:41 ]
ダンゴさんの星が落ち着いてきたな






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

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

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