Сдвиг левого бита 255 (в байтах) - PullRequest
16 голосов
/ 10 апреля 2009

Может кто-нибудь объяснить, почему следующее не компилируется?

byte b = 255 << 1

Ошибка:

Постоянное значение «510» не может быть преобразовано в «байт»

Я ожидаю следующего в двоичном формате:

1111 1110

Преобразование типов поставило меня в тупик.

Ответы [ 7 ]

35 голосов
/ 10 апреля 2009

Числовые литералы в C #: int, а не byte (и сдвиг битов будет оцениваться компилятором, следовательно, останется только 510). Поэтому вы пытаетесь присвоить значение byte, которое не подходит. Вы можете замаскировать с 255:

byte b = (255 << 1) & 0xFF

чтобы снова уменьшить результат до 8 бит. В отличие от Java, C # не допускает, чтобы переполнения проходили незамеченными. По сути, у вас было бы две разумные опции при попытке назначить 510 байту: либо зафиксировать максимальное значение, затем вы получите 255, либо выбросить не подходящие биты, и в этом случае вы получите 254.

Вы также можете использовать unchecked, так как lassevk упоминается :

byte b = unchecked((byte)(255 << 1));
8 голосов
/ 10 апреля 2009

Вы сдвигаете 255 на 1 бит, а затем пытаетесь присвоить его байту. 255 << 1 is 510, а 510 не помещается в байт.

5 голосов
/ 10 апреля 2009

Результатом оператора << является Int32, а не то, что вы в него положили.

Вам нужно привести результат сдвига, а не ввод. Кроме того, это приведет к переполнению (оно больше байта), поэтому вам нужно указать, что вам нужно непроверенное приведение.

Другими словами, это будет работать:

Byte b = unchecked((Byte)(255 << 1));
5 голосов
/ 10 апреля 2009
byte b = 0xff & (255 << 1);
3 голосов
/ 10 апреля 2009

вы пробовали разыграть его?

byte b = (byte)(255 << 1)

Это интересный подход - приведенный выше код будет работать, если он будет заключен в блок unchecked, например:

unchecked
{
    byte b = (byte)(255 << 1);
}

Поскольку это unchecked, значение усекается до предполагаемого значения 254. Так что это можно сделать с помощью приведения!

1 голос
/ 10 апреля 2009
255 << 1

даст вам более одного байта.

0 голосов
/ 10 апреля 2009

И поскольку << имеет более высокий приоритет, чем &, вы можете сохранить скобки: </p>

byte b = 255 << 1 & 0xff;
...