Подтвердить что ты не робот

Перемещение левого бита 255 (в виде байта)

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

byte b = 255 << 1

Ошибка:

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

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

1111 1110

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

byte b = 0xff & (255 << 1);

Ответ 4

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

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

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

Byte b = unchecked((Byte)(255 << 1));

Ответ 5

255 << 1

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

Ответ 6

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

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

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

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

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

Ответ 7

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

byte b = 255 << 1 & 0xff;