Оставленный бит, смещающийся 255 (как байт)

Это потому, что вы проверяете только следующий номер. Если вам нужен второй номер (например, 9 или 3), вы должны также включить проверку для предыдущего номера. Это сделает if немного длиннее, но это сработает.

num=[8,9,4,1,2,3]

for i in range(len(num)):
    if (
        (  # check for the next number
            i + 1 != len (num) and  # don't check the end of the list
            num[i]+1==num[i+1] 
        ) or (  # check for the previous number
            i != 0 and  # don't check before the list
            num [i-1] == num [i] - 1
        )
    ): print('Con',num[i])

Кроме того, мне пришлось убрать -1 в вашем диапазоне, потому что я уже делаю ручную проверку, и, как указывалось, это показало 3 из показа.

16
задан Helen 17 July 2009 в 22:34
поделиться

7 ответов

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

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

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

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

byte b = unchecked((byte)(255 << 1));
35
ответ дан 30 November 2019 в 15:24
поделиться

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

8
ответ дан 30 November 2019 в 15:24
поделиться
byte b = 0xff & (255 << 1);
5
ответ дан 30 November 2019 в 15:24
поделиться

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

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

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

Byte b = unchecked((Byte)(255 << 1));
5
ответ дан 30 November 2019 в 15:24
поделиться

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

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

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

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

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

3
ответ дан 30 November 2019 в 15:24
поделиться
255 << 1

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

1
ответ дан 30 November 2019 в 15:24
поделиться

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

byte b = 255 << 1 & 0xff;
0
ответ дан 30 November 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: