2010-12-24 6 views
3

У меня есть следующий код для получения MSB (старший значащий бит) из неотрицательного числа, Int32 быть более точным:. NET - Является ли MSB для агностики платформы int32?

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; 
} 

Again: при условии, что значение не является отрицательным.

Мой вопрос:
Является ли платформа .NET гарантией того, что этот код будет работать надлежащим образом на каждой платформе: x86/Windows/Linux/Sun/64bit?

Является ли представление Int32 внутри .NET, в том числе Endianness и бит/байтовый порядок, платформа агностик?

Заранее спасибо!
BTW, если это своего рода дубликат - прокомментируйте это как можно скорее. Благодаря!

+0

Там ничего платформозависимым о системе счисления основание-2 , – kenny

ответ

3

До тех пор, пока вы лечите его как int, да, это платформа агностик. Это включает в себя все арифметические и поразрядные операции (<<, >> и т. Д.). Коды операций всегда проверяют, что он делает то, что вы ожидаете.

Однако! Если вы заглядываете под обложки, это может вопрос; например BitConverter.GetBytes(int) и BitConverter.ToInt32 забота о контенте. Вы можете проверить это с помощью BitConverter.IsLittleEndian; обычно это true на «обычных» .NET, но может быть false возможно на IA64 или XNA или Mono на некоторых архитектурах.

Та же логика применима к любому небезопасного кода, который принуждает (например) между byte* и int*, или любого союзов построенной с помощью [StructLayout].

Но в нормальный код, все должно быть в порядке.

1

Ваш код будет работать всегда.

Это не потому, что представление Int32 не изменится с платформы на платформу, а потому, что ваш код достаточно хорошо написан, чтобы не полагаться на него: вы являетесь ANDing Int32s с другими Int32. В случае, если формат изменился, это изменение повлияет как на число, которое вы тестируете, так и на записи в таблице полномочий 2, в равной степени - так что код все равно будет работать.

2

порядок байт зависит от платформы, но здесь ваш код не зависит от байтов вообще.

Порядок байтов приходит только в игру, когда вы используете низкий уровень вещи, как указатели, профсоюзы (StructLayout: Явные) или BitConverter.

Bitshifts, целочисленная арифметика и нормальные слепки между целочисленными типами являются обратным порядком байт агностика.

0

Код переносимый, однако он возвращает 0 в качестве MSB для int.MinValue, который на самом деле является 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

"учитывая, что значение не является отрицательным". спасибо за предлагаемый код. –