Jump to content

Логический сдвиг

(Перенаправлено с логического сдвига влево )

В информатике логический сдвиг — это побитовая операция , которая сдвигает все биты своего операнда. Двумя базовыми вариантами являются логический сдвиг влево и логический сдвиг вправо . Это дополнительно модулируется количеством битовых позиций, на которые должно быть сдвинуто данное значение, например сдвиг влево на 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 = младший значащий бит

  1. ^ «Интерфейсы пакетов» . www.adaic.org .
  2. ^ «Установить — Переменная среды — Windows CMD — SS64.com» . ss64.com .
  3. ^ «Побитовые операторы — Python Wiki» . wiki.python.org . Проверено 24 января 2018 г.
  4. ^ "ЗЫ в std::ops - Rust" . doc.rust-lang.org . Проверено 17 января 2022 г.
  5. ^ «Операторские выражения: арифметические и логические бинарные операторы» . doc.rust-lang.org . Проверено 13 ноября 2022 г.
  6. ^ «Набор инструкций PowerPC: slw» . pds.twi.tudelft.nl . Архивировано из оригинала 4 сентября 2014 года . Проверено 9 апреля 2016 г.
  7. ^ «Справочник по набору команд x86» . x86.renejeschke.de . Архивировано из оригинала 19 февраля 2018 года . Проверено 9 апреля 2016 г.
  8. ^ «Поле Opcodes.Shl» . msdn.microsoft.com . Майкрософт . Проверено 9 апреля 2016 г.
  9. ^ «Справочное руководство по языку LLVM — инструкция shl» . llvm.org . Проект ЛЛВМ . Проверено 9 апреля 2016 г.
  10. ^ «<< Оператор (Справочник по C#)» . msdn.microsoft.com . Майкрософт . Проверено 9 апреля 2016 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 80664283d8db5e2bfca6cf4a80f17012__1719260880
URL1:https://arc.ask3.ru/arc/aa/80/12/80664283d8db5e2bfca6cf4a80f17012.html
Заголовок, (Title) документа по адресу, URL1:
Logical shift - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)