2010-12-24 12 views
3

私はより具体的には、負でない整数からMSB(最上位ビット)を取得するための次のコードを持っているInt32:再び.NET - int32プラットフォームのMSBは不可能ですか?

private static readonly int[] powersOf2 = new int[] 
             { 
              1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 
              32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 
              8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 
              1073741824 
             }; 

public static int GetMsb(int value) 
{ 
    for (int k = powersOf2.Length - 1; k >= 0; k--) 
    { 
     var bit = (value & powersOf2[k]) != 0; 
     if (bit) 
      return (k + 1); 
    } 
    return 0; 
} 

:値が負でないことを考えます。

私の質問は次のとおりです。
このフレームワークは、このコードがすべてのプラットフォーム(x86/Windows/Linux/Sun/64bit)で適切に動作することを保証しますか?

エンディアンとビット/バイトオーダー、プラットフォームに依存しない.NET内でのInt32の表現ですか?

ありがとうございます!
こちらが重複している場合は、できるだけ早くコメントしてください。ありがとう!

+0

ベース-2番号システムに関する具体的な何もプラットフォームがあります。ここのすべてのビットのために働く、私は信じている、とあらゆる事前に計算値を必要としないコードがあります。 – kenny

答えて

3

intとして扱っている限り、それはプラットフォームに依存しません。これには、すべての算術演算とビット単位の演算(<<,>>など)が含まれます。オペコードはいつもあなたが期待していることを確認します。

ただし、あなたがカバーの下を覗くと、それはかもしれません問題;たとえばBitConverter.GetBytes(int)およびBitConverter.ToInt32はエンディアンを気にします。これはBitConverter.IsLittleEndianで確認できます。 「通常」.NETでは通常はtrueですが、IA64ではおそらくfalse、一部のアーキテクチャではXNAまたはMonoになる可能性があります。

同じ論理が[StructLayout]を介して構築byte*及びint*、または任意組合間(例えば)強制変換任意の安全でないコードに適用されます。

コードでは、あなたは大丈夫でしょう。

1

コードは常に動作します。

これは、Int32の表現がプラットフォームからプラットフォームに変わらないためではありませんが、あなたのコードは十分に書き込まれているため、他のInt32とのANDingを行っているからです。フォーマットが変更された場合、変更はテストしている番号と2のべき乗表のエントリに同じように影響するため、コードは引き続き動作します。

2

エンディアンはプラットフォームに依存しますが、ここのコードはエンディアンにはまったく依存しません。

エンディアンは、ポインタ、共用体(StructLayout:Explicit)、BitConverterなどの低レベルのものを使用する場合にのみ発生します。

整数型間のビットシフト、整数算術および通常のキャストは、エンディアンに依存しません。

0

コードは移植性がありますが、符号付き整数を使用しているため、int.MinValueのMSBとして0が実際には0x80000000のhexaになります。

public static int GetMsb(int value) 
{ 
    for(int i = 31; i >= 0; i--) 
    { 
     if ((value & 0x80000000) != 0) return i; 
     value <<= 1; 
    } 
    return 0; 
} 

またはuintと::

public static int GetMsb(uint value) 
{ 
    for(int i = 31; i >= 0; i--) 
    { 
     if ((value & 0x80000000) != 0) return i; 
     value <<= 1; 
    } 
    return 0; 
} 
+0

"値が負でない場合"しかし、提案されたコードに感謝します。 –

関連する問題