Это потому, что вы проверяете только следующий номер. Если вам нужен второй номер (например, 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 из показа.
Числовыми литералами в C # являются int
, а не байт
(и сдвиг битов будет оцениваться компилятором, следовательно, останется только 510). Поэтому вы пытаетесь присвоить значение байту , который не подходит. Вы можете маскировать с помощью 255:
byte b = (255 << 1) & 0xFF
, чтобы снова уменьшить результат до 8 бит. В отличие от Java, C # не допускает, чтобы переполнения проходили незамеченными. Обычно при попытке назначить байту 510 у вас было бы два разумных варианта: либо зафиксировать максимальное значение, затем вы получите 255, либо выбросить не подходящие биты, и в этом случае вы получите 254.
Вы также можете использовать без проверки
, так как lassevk упоминал :
byte b = unchecked((byte)(255 << 1));
Вы сдвигаете 255 на 1 бит, а затем пытаетесь присвоить его байту.
255 << 1 - это 510
, а 510 не помещается в байт.
Результат <<
оператором является Int32
, а не то, что вы в него вкладываете.
Вам нужно привести результат сдвига, а не вход. Кроме того, это приведет к переполнению (оно больше байта), поэтому вам нужно указать, что вам нужно непроверенное приведение.
Другими словами, это будет работать:
Byte b = unchecked((Byte)(255 << 1));
вы пытались его разыграть?
byte b = (byte)(255 << 1)
Это интересный подход - приведенный выше код будет работать, если обернут в unchecked блок
, например:
unchecked
{
byte b = (byte)(255 << 1);
}
Так как он unchecked
, значение усекается до предполагаемого значения 254. Так что это можно сделать с помощью приведения!
И поскольку << имеет более высокий приоритет, чем &, вы можете сохранить скобки:
byte b = 255 << 1 & 0xff;