2012-10-27 2 views
0
Console.WriteLine(7 << 4); 
Console.WriteLine(7 >> (32 - 4)); 

По какой-то причине второй метод возвращает 0 вместо 112. Но они оба должны быть равны друг другу, они оба должны вернуться 112.смещение сдвига возвращает неправильный результат

UPDATE: Это Известно, что (x << n) == (x >> (32 - n)).

Ваши идеи?

+1

Где вы взяли идею, что те являются циклическими? – Mat

+0

В книге (.....) –

+1

http://msdn.microsoft.com/en-us/library/aa691377(v=vs.71).aspx для документов. – Mat

ответ

2

Не действительно понять, что вы ожидаете увидеть здесь:

7 << 4 смещается влево (как умножение) 7 * (2^4) = 7 * 16 = 112

на другой руке

7 >> (32 - 4) смещается вправо (как деление) 7/(2^28), который преобразуется в целочисленное значение, приводит к 0.

Возникает вопрос: почему Console.WriteLine Пики числа перегрузки: это заставит вас действовать целые значения так ожидаемой по CLR результату является int.

Результат is правильный.

+0

Посмотрите на мое обновление –

+1

A '>>' _is not_ a division, это сдвиг. Результатом является то, что только без велосипеда результат от деления. –

+0

Правильно, я предположил, что это * не * о велоспорте, но глядя на отредактированный ответ увидел это. редактирования. – Tigran

1
(x << n) == (x >> (32 - n)) 

Это справедливо только в том случае, если выполняется круговой сдвиг, что не имеет места в C#. В C# эти биты теряются, если они сдвинуты прямо перед первым битом.

//Seven = 00000111 
Console.WriteLine(7 >> 1); //00000011 
Console.WriteLine(7 >> 2); //00000001 
Console.WriteLine(7 >> 3); //00000000 
Console.WriteLine(7 >> 4); //00000000 
//. 
//. 
//. 
Console.WriteLine(7 >> 28); //00000000 

пояснено более подробно здесь: Is there a way to perform a circular bit shift in C#?

Смежные вопросы