Я недооценил сложность оператора >>
;это не делает то, что я думал.
Я хочу сдвинуть вправо значение uint
6542454. Я думал, что это работает так:
val (is) == 11000111101010001110110
val >> 1 == 1100011110101000111011
val >> 2 == 110001111010100011101
val >> 3 == 11000111101010001110
val >> 4 == 1100011110101000111
val >> 5 == 110001111010100011
val >> 6 == 11000111101010001
val >> 7 == 1100011110101000
В действительности, результаты таковы:
val >> 1 == 1100011110101000111011
val >> 2 == 110001111010100011101
val >> 3 == 11111001100100110010011
val >> 4 == 1111100110010011001001
val >> 5 == 111110011001001100100
val >> 6 == 11111001100100110010
val >> 7 == 10011011111110111111100
Третья операция явно делает что-то, чего я не понимаю, и оттуда дела идут плохо.Кажется, делает то, что я не понимаю, снова в 7-й операции.
Использование оператора >>=
7 раз подряд дает значения, которые я ожидаю:
val >>= 1 == 1100011110101000111011
val >>= 1 == 110001111010100011101
val >>= 1 == 11000111101010001110
val >>= 1 == 1100011110101000111
val >>= 1 == 110001111010100011
val >>= 1 == 11000111101010001
val >>= 1 == 1100011110101000
Почему val >> 3
не даеттот же результат, что и 3 вызова val >>= 1
?
ОБНОВЛЕНИЕ:
Моя ошибка для с использованием десятичного в двоичный преобразователь в сети, который усекал мой десятичный вход до 7 цифр .При копировании + вставке десятичных значений из Visual Studio я не заметил, что происходит усечение.
Фактическое смещенное значение равно 6542454 26 , и, как все правильно указывают, C # - бит-смещение этого значения идеально.