Язык или процессор | Оставил | Верно |
---|---|---|
Ада [1] | Shift_Left | Shift_Right |
Пакетный , [2] C , C ++ , Go , Swift (только для беззнаковых типов); Стандартный ML , Verilog , PHP , Python [3] | << | >> |
D , Java , JavaScript , Юлия | << | >>> |
F # (только для беззнаковых типов) | <<< | >>> |
Фортран | LSHIFT | РСХИФТ |
OCaml | lsl | LSR |
Object Pascal , Delphi , сборка x86 , Kotlin , Powershell | шл | шр |
Язык описания оборудования VHSIC ( VHDL ), MIPS | sll | srl |
PowerPC | slw | srw |
В информатике , логический сдвиг представляет собой операцию поразрядного , что сдвигает все биты операнда. Двумя базовыми вариантами являются логический сдвиг влево и логический сдвиг вправо . Это дополнительно модулируется количеством битовых позиций, на которые должно быть сдвинуто данное значение, например сдвиг влево на 1 или сдвиг вправо на n . В отличие от арифметического сдвига , логический сдвиг не сохраняет знаковый бит числа и не отличает показатель степени числа от его значимости (мантиссы); каждый бит в операнде просто перемещается на заданное количество битовых позиций, а свободные битовые позиции заполняются, как правило, нулями и, возможно, единицами (в отличие от кругового сдвига ).
Логический сдвиг часто используется, когда его операнд рассматривается как последовательность битов, а не как число.
Логические сдвиги могут быть полезны как эффективные способы выполнения умножения или деления целых чисел без знака на степени двойки. Сдвиг влево на n бит для двоичного числа со знаком или без знака приводит к его умножению на 2 n . Сдвиг вправо на n битов беззнакового двоичного числа приводит к его делению на 2 n (округление в сторону 0).
Логический сдвиг вправо отличается от арифметического сдвига вправо. Таким образом, для многих языков есть разные операторы . Например, в Java и JavaScript логический оператор сдвига вправо - >>> , а арифметический оператор сдвига вправо - >> . (В Java есть только один оператор сдвига влево ( << ), потому что сдвиг влево с помощью логики и арифметики имеет одинаковый эффект.)
Однако в языках программирования C , C ++ и Go есть только один оператор сдвига вправо, >> . Большинство реализаций C и C ++ и Go выбирают, какой сдвиг вправо выполнять в зависимости от типа сдвигаемого целого числа: целые числа со знаком сдвигаются с использованием арифметического сдвига, а целые числа без знака сдвигаются с использованием логического сдвига.
Все актуальные в настоящее время стандарты C (ISO / IEC 9899: 1999–2011) оставляют пробел в определении для случаев, когда количество сдвигов больше или равно количеству битов в операндах, поэтому результат не определен. Это помогает компиляторам C генерировать эффективный код для различных платформ, позволяя напрямую использовать собственные инструкции сдвига, которые имеют разное поведение. Например, shift-left-word в PowerPC выбирает более интуитивно понятное поведение, при котором сдвиг на разрядность или выше дает ноль [4], тогда как SHL в x86 предпочитает маскировать величину сдвига до младших битов, чтобы сократить максимальное время выполнения. инструкций , и поэтому сдвиг на разрядность не меняет значения. [5]
Некоторые языки, такие как .NET Framework и LLVM , также оставляют смещение по разрядности и выше неопределенным (.NET) [6] или неопределенным (LLVM). [7] Другие предпочитают определять поведение своих наиболее распространенных целевых платформ, таких как C #, который определяет поведение x86. [8]
Пример
Если битовая последовательность 0001 0111 (десятичное 23) логически сдвинута на одну битовую позицию, то:
Сдвиг влево дает: 0010 1110 (десятичное 46). | Сдвиг вправо дает: 0000 1011 (десятичное 11) |
Примечание: MSB = старший бит, LSB = младший бит.
Рекомендации
- ^ Справочное руководство по Ада с аннотациями
- ^ https://ss64.com/nt/set.html
- ^ "BitwiseOperators - Python Wiki" . wiki.python.org . Проверено 24 января 2018 .
- ^ «Набор инструкций PowerPC: slw» . pds.twi.tudelft.nl . Проверено 9 апреля +2016 .
- ^ «Справочник по набору команд x86» . x86.renejeschke.de . Проверено 9 апреля +2016 .
- ^ "Поле Opcodes.Shl" . msdn.microsoft.com . Microsoft . Проверено 9 апреля +2016 .
- ^ "Справочное руководство по языку LLVM - инструкция shl" . llvm.org . LLVM Project . Проверено 9 апреля +2016 .
- ^ «Оператор << (Справочник по C #)» . msdn.microsoft.com . Microsoft . Проверено 9 апреля +2016 .