#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. Да, я только что сделал то же самое, и я тоже получаю ожидаемые результаты.