Операция логического сдвига вправо на целое число со знаком - PullRequest
0 голосов
/ 10 октября 2010

Логическое смещение вправо на 3 операции с целым числом со знаком -28.Какой правильный ответ?

  1. + 203
  2. + 83
  3. + 3
  4. -3

2дополнение к -28 равно 11100100. Теперь, если я применяю логическую операцию сдвига вправо, я не получаю ни одного из приведенных выше ответов.

Ответы [ 4 ]

1 голос
/ 10 октября 2010

Я почти уверен, что это вопрос с подвохом.

Интервьюер выяснил, отвечаете ли вы на "-3".Если бы вы имели (с ошибочным рассуждением, что, поскольку 28 >>> 3 - это 3, то -28 >>> 3 - это -3), он бы понял, что вы не понимаете дополнения к двум.

Онхотел, чтобы вы ответили, что ни один из четырех вариантов не является правильным.Он хотел, чтобы вы

  1. объяснили, как логический сдвиг вправо, в отличие от арифметического сдвига вправо, превратит небольшое число отрицательных чисел в огромное положительное число, превращая бит знака в часть величины
  2. укажите, что ответ зависит от того, сколько байтов используется для представления целого числа
0 голосов
/ 02 мая 2014

Сдвиг целого числа со знаком вправо может сделать несколько вещей:

  1. , если число было отрицательным, это подпишет, чтобы расширить результат (сдвиг в 1 бит на левой стороне),что должно привести к тому, что число будет выглядеть как меньшее отрицательное число.
  2. Если число было положительным, оно разделит его на два для каждого сдвинутого вами бита.

Но это поведение технически «определено реализацией».

Пожалуйста, смотрите этот пост: Являются ли операторы сдвига (<<, >>) арифметическими или логическими в C?

0 голосов
/ 12 октября 2010

Это глупый вопрос, как:

  • , добавляется ли 0 или 1 слева, не всегда определяется для отрицательных чисел (Википедия говорит, что "заполнены свободные битовые позиции, обычно с нулями" - мой акцент)
  • рассматриваемый целочисленный размер не обсуждается, а
  • существует несколько побитовых представлений отрицательных чисел.

В некоторых языках (например, в Java, я считаю) появились новые наиболее значимые биты, так что любая платформа, не имеющая подходящей инструкции ЦП, должна будет выдавать несколько, чтобы вычислить требуемый ответ, тогда как другие языки могут определять реализацию. выбор между поведением, которое изначально предлагает процессор.

2 является наиболее распространенным представлением отрицательных чисел. Ваш вопрос гласит: «2-е дополнение к -28 - это 11100100.» ... Я предполагаю, что это не было предоставлено как часть вопроса (немного странно, если это так, так как это после ответов). Тем не менее ...

Если мы бежим с дополнением 2 ...

11100100 >> 3 = 00011100 or 11111100 = 28 or -4

Если представление было дополнением 1:

11100011 >> 3 = 00011100 or 11111100 = 28 or -3

Если представление было знаковым, абсолютное значение:

10011100 >> 3 = 00010011 or 11110011 = 19 or -(127-12)=-115

(note that the question says a logical bit shift, which by definition ignores any possible interpretation of the bits, so the sign bit is shifted along with others)

Re #bits в int ... Я думаю, это настолько очевидно, что это приведет либо к значению, которое слишком велико, чтобы соответствовать любому из параметров, либо иначе это не будет иметь никакого значения (если добавить 1s слева для дополнения 1 или 2), что мы можем игнорировать эту проблему.

Таким образом, если мой быстрый расчет, приведенный выше, не ускользнул, -3 - это единственный ответ, который может быть верным для любой вероятной архитектуры, но все же очень маловероятно. В общем, мне интересно, не проверяли ли они на самом деле, кто был уверен, чтобы оставить вопрос без ответа, или комментировать, что ни один из ответов, скорее всего, не был правильным ...

0 голосов
/ 10 октября 2010

Может быть, уловка состоит не в том, чтобы предполагать представление в виде дополнения до двух. Предполагая представление знак-величина , ответом может быть -3, так как большинство реализаций сдвига не задействуют знаковый бит.

...