Примечание : Этот ответ был сильно отредактирован из-за недостатка информации в исходном вопросе. Эта версия ответа теперь основана на обновленном вопросе с достаточным количеством информации. Для истории, проверьте журнал редактирования.
Две вещи:
&&
используется между логическими выражениями для определения логического значения AND
^
в C # означает XOR, а не возведен в степень. Вы не задавали вопрос об этом, но было неизбежно, что вы обнаружили, что ^
, кажется, не выполняет свою работу.
&&
легко обрабатывается, поскольку его можно заменить одним &
, который имеет двойное значение в зависимости от контекста. Либо это логический оператор AND с полной оценкой (&&
является короткозамкнутым оператором), либо это побитовый оператор, который вам здесь нужен.
^
отличается, хотя. Наиболее прямым эквивалентом является Math.Pow , но в этом случае доступна лучшая альтернатива, bit-shift.
Случай 2^X
можно рассматривать как смещение 1-битных позиций X влево , а смещение битов влево имеет свой собственный оператор, <<
оператор.
Так что 2^X
можно заменить на 1 << X
.
В этом контексте, вот что вы хотите для своего внутреннего оператора if:
if ((intNumber & (1 << index)) != 0)
a = a + "1";
else
a = a + "0";
Вставьте это в цикл, как у вас в нижнем примере, и вы получите следующее:
for (Int32 index = 7; index >= 0; index--)
if ((intNumber & (1 << index)) != 0)
bin = bin + "1";
else
bin = bin + "0";
Теперь конкатенация строк, подобных этой, создает давление GC, поэтому вам, вероятно, следует либо сохранить эти цифры в массиве Char
, а затем создать строку или использовать класс StringBuilder. В противном случае вы соберете 8 (из моего примера) строк разного размера, и вы будете использовать и сохранять только последнюю. В зависимости от обстоятельств это может не вызывать проблем, но если вы будете вызывать этот код много раз, он будет складываться.
Вот лучшая версия окончательного кода:
Char[] digits = new Char[8]; // change if you want more/fewer digits
for (Int32 index = 0; index < digits.Length; index++)
if ((intNumber & (1 << index)) != 0)
digits[digits.Length - 1 - index] = '1';
else
digits[digits.Length - 1 - index] = '0';
bin = new String(digits);
Однако, а вот и кикер. В .NET уже есть способ преобразовать значение Int32 в строку, полную двоичных цифр, и это метод Convert.ToString. Разница лишь в том, что он не добавляет начальных нулей, поэтому мы должны сделать это сами.
Итак, вот последний код, который вы должны использовать:
String bin = Convert.ToString(intNumber, 2).PadLeft(8, '0');
Это заменяет весь цикл.