Неожиданный правильный сдвиг битов C # - PullRequest
4 голосов
/ 04 мая 2011

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

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

1 Ответ

6 голосов
/ 04 мая 2011

Я написал код для вывода каждой смены:

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
...