Неожиданный результат сдвига бита C # вправо

#c# #bit-shift

#c# #сдвиг бита

Вопрос:

Я недооценил сложность >> оператора; он выполняет не то, что я ожидал.

Я хочу сдвинуть вправо 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 я не заметил, что происходит усечение.

Фактическое значение, которое сдвигается, равно 654245426, и, как все правильно отмечают, C # отлично сдвигает бит этого значения.

Комментарии:

1. Не могли бы вы предоставить простой пример программы, которая воспроизводит проблему? Описанное вами поведение нарушает спецификацию C #, поэтому стоит проверить, нет ли у вас другой проблемы, такой как проблемы с приоритетом операторов в вашем коде, который вычисляет сдвиг.

2. Можете ли вы показать код, который вы используете для печати значений? You >> 3 показывает почти правильный результат в Dec (8178067) вместо 817806. Итак, я предполагаю, что ваш печатный код отключен…

Ответ №1:

Я написал код для вывода каждого сдвига:

 uint i = 6542454;

for (int j = 0; j < 8; j  )
{
    uint k = i >> j;
    Console.WriteLine("{1} = {0}", Convert.ToString(k, 2), k);
}
  

и это то, что я ожидал и действительно увидел.

 6542454 = 11000111101010001110110
3271227 = 1100011110101000111011
1635613 = 110001111010100011101
817806 = 11000111101010001110
408903 = 1100011110101000111
204451 = 110001111010100011
102225 = 11000111101010001
51112 = 1100011110101000
  

Комментарии:

1. Да, я только что сделал то же самое, и я тоже получаю ожидаемые результаты.