タイトル一覧   関連タグ: Win C#
タグ:Win C# タイトル:ビット演算
1 2
1:  お名前:びるけん 2007/09/11 9:19:49

PHPとC#でビット演算をしていますが、
PHPビット演算した値と、
C#で演算した値とでは

値を大きくした場合、
(C#でいうとlong以上)
になると、結果が違ってきます。

C#とPHPではビット演算のアルゴリズムが違うのでしょうか?
また、C#とPHPとを同じことをしようとするならば、
C#をどのように記述すればいいのでしょうか?

よろしくお願いします。
2:  お名前:渋木宏明(ひどり) 2007/09/11 11:08:58

具体的に、C# と PHP それぞれでどういうコードを書いて、どんな値が得られているんでしょうか?
3:  お名前:びるけん 2007/09/11 11:35:33

大変失礼致しました。

ソースコード
1000000000 >> 12;
C# 244140
PHP 244140

10000000000 >> 12;
C# 2441406
PHP 344254

となってしまいます。


よろしくお願いします。
4:  お名前:石野光仁 2007/09/11 13:10:45

こんにちは、アイライトの石野です。

PHPが正しいと思って調べていたので C#にバグがあるのでは?
とドキドキしましたが、
Windowsに入っている電卓で計算すると、C#の結果と同じ値に
なりました。

もう少し調べてみますが、中間報告まで
5:  お名前:石野光仁 2007/09/11 13:16:00

やっぱり PHPの値がおかしいように思えますね、
上位3ビットが抜け落ちています。

右へ12シフトすると言うことは、4096で割ることですので
1000000000 / 4096 = 244140
10000000000 / 4096 = 2441406
となりますので、C#が正しいように思えます
6:  お名前:びるけん 2007/09/11 13:52:28

なるほど、
ありがとうございます。

ということは、C#を無理やり合わそうとするならば、
10000000000 >> 12;
の10000000000に何かを差し引かないといけないということですね?

7:  お名前:石野光仁 2007/09/11 14:20:36

こんにちは、アイライトの石野です。

PHPの仕様を調べてないので、いい加減な回答ですが、
上位3ビットが抜けているという事で

(10000000000 >> 12 & 0x7FFFF)

と計算すれば、今回の式には当てはまるみたいです。
マスクも中途半端な19ビットですので、不思議です。

#PHPのシステムが正しく動いているのかすごく心配です・・・
#今回の式も、別のケースでは動かない場合もありますので、
#計算結果として何が欲しいのか十分に検討してから使ってくださいね
8:  お名前:青柳 臣一 2007/09/11 19:05:04

PHP って何bit まで扱えるんですか?

10000000000 は 16進数で書くと 0x2540BE400 です。
32bit に収まるように頭をちょんぎると 0x540BE400 です。
0x540BE400 >> 12 を求めると 0x540BE で、これは 344254 です。

C# は int は 32bit、long は 64bit です。
仕様書などを確認はしていませんが、コンパイラが 10000000000 を 64bit 値と扱ってくれているために正しく演算ができているんじゃないですか?
9:  お名前:かずくん 2007/09/11 20:36:45

>PHP って何bit まで扱えるんですか?
http://www.php.net/manual/ja/language.types.integer.php
より引用>>
  整数のサイズはプラットフォームに依存しますが、 約 20 億 (32   ビット符号付) が一般的な値です。
<<引用ここまで
10:  お名前:石野光仁 2007/09/12 10:31:53

ぐは・・・ 恥ずかしい
32bitが影響しているだろうなと 想像はしていたのですが、
結果に注目しすぎて、大事なところに気がつかなかったです。


まだまだ修行が足りないですね。 日々精進。




1 2
お名前
メッセージ
次回のために入力情報を記録