Логический сдвиг
Эта статья нуждается в дополнительных цитатах для проверки . ( апрель 2016 г. ) |
В информатике логический сдвиг — это побитовая операция , которая сдвигает все биты своего операнда. Двумя базовыми вариантами являются логический сдвиг влево и логический сдвиг вправо . Это дополнительно модулируется количеством битовых позиций, на которые должно быть сдвинуто данное значение, например сдвиг влево на 1 или сдвиг вправо на n . В отличие от арифметического сдвига числа , логический сдвиг не сохраняет бит знака числа и не отличает показатель степени от его мантиссы (мантиссы); каждый бит в операнде просто перемещается на заданное количество битовых позиций, а свободные битовые позиции заполняются, обычно нулями, а возможно и единицами (в отличие от кругового сдвига ).
Логический сдвиг часто используется, когда его операнд рассматривается как последовательность битов, а не как число.
Язык или процессор | Левый | Верно |
---|---|---|
Есть [1] | Shift_Left | Shift_Right |
Партия , [2] C , C++ , Go , Swift (только беззнаковые типы); Стандартное машинное обучение , Verilog , PHP , Python , [3] Ржавчина [4] (только беззнаковые типы [5] ) |
<< | >> |
Д , Java , JavaScript , Джулия | << | >>> |
F# (только беззнаковые типы) | <<< | >>> |
Фортран | ЛШИФТ | РШИФТ |
OCaml | лсл | лср |
Object Pascal , Delphi , сборка x86 , Kotlin , Powershell | шл | шр |
Язык описания оборудования VHSIC ( VHDL ), MIPS | слл | срл |
PowerPC | медленный | Мистер |
Логические сдвиги могут быть полезны как эффективные способы умножения или деления целых чисел без знака на степени двойки. Сдвиг влево на n бит знакового или беззнакового двоичного числа приводит к его умножению на 2. н . Сдвиг вправо на n бит беззнакового двоичного числа приводит к его делению на 2. н (округление в сторону 0).
Логический сдвиг вправо отличается от арифметического сдвига вправо. есть разные операторы Таким образом, во многих языках для них . Например, в Java и JavaScript логический оператор сдвига вправо — это >>> , но арифметический оператор сдвига вправо >> . (В Java есть только один оператор сдвига влево ( << ), поскольку сдвиг влево с помощью логики и арифметики имеет тот же эффект.)
языки программирования C , C++ и Go имеют только один оператор сдвига вправо. Однако >> . Большинство реализаций C и C++, а также Go, выбирают, какой сдвиг вправо выполнять, в зависимости от типа смещаемого целого числа: целые числа со знаком сдвигаются с использованием арифметического сдвига, а целые числа без знака сдвигаются с использованием логического сдвига. В частности, C++ использует операторы логического сдвига как часть синтаксиса функций ввода и вывода, называемых «cin» и «cout» соответственно.
Все соответствующие в настоящее время стандарты C (ISO/IEC 9899:1999–2011) оставляют пробел в определениях для случаев, когда количество сдвигов равно или превышает количество битов в операндах, поэтому результат не определен. Это помогает компиляторам C создавать эффективный код для различных платформ, позволяя напрямую использовать собственные инструкции сдвига, которые имеют различное поведение. Например, сдвиг влево-слова в PowerPC выбирает более интуитивное поведение, при котором сдвиг на ширину бита или выше дает ноль, [6] тогда как SHL в x86 предпочитает маскировать величину сдвига в младшие биты , чтобы уменьшить максимальное время выполнения инструкций , и поэтому сдвиг на ширину бита не меняет значение. [7]
Некоторые языки, такие как .NET Framework и LLVM сдвиг по разрядности и выше , также оставляют неопределенным (.NET). [8] или неопределенное (LLVM). [9] Другие предпочитают указывать поведение наиболее распространенных целевых платформ, например C# , который определяет поведение x86. [10]
Пример
[ редактировать ]Если битовая последовательность 0001 0111 (десятичное 23) логически сдвинута на одну битовую позицию, то:
Сдвиг влево дает: 0010 1110 (десятичное 46). | Сдвиг вправо дает: 0000 1011 (десятичное 11). |
Примечание. MSB = старший бит, LSB = младший значащий бит
Ссылки
[ редактировать ]- ^ «Интерфейсы пакетов» . www.adaic.org .
- ^ «Установить — Переменная среды — Windows CMD — SS64.com» . ss64.com .
- ^ «Побитовые операторы — Python Wiki» . wiki.python.org . Проверено 24 января 2018 г.
- ^ "ЗЫ в std::ops - Rust" . doc.rust-lang.org . Проверено 17 января 2022 г.
- ^ «Операторские выражения: арифметические и логические бинарные операторы» . doc.rust-lang.org . Проверено 13 ноября 2022 г.
- ^ «Набор инструкций PowerPC: slw» . pds.twi.tudelft.nl . Архивировано из оригинала 4 сентября 2014 года . Проверено 9 апреля 2016 г.
- ^ «Справочник по набору команд x86» . x86.renejeschke.de . Архивировано из оригинала 19 февраля 2018 года . Проверено 9 апреля 2016 г.
- ^ «Поле Opcodes.Shl» . msdn.microsoft.com . Майкрософт . Проверено 9 апреля 2016 г.
- ^ «Справочное руководство по языку LLVM — инструкция shl» . llvm.org . Проект ЛЛВМ . Проверено 9 апреля 2016 г.
- ^ «<< Оператор (Справочник по C#)» . msdn.microsoft.com . Майкрософт . Проверено 9 апреля 2016 г.