Симаргл Posted February 16, 2006 Report Share Posted February 16, 2006 Люди, изучаю значит С++ и сколько ни чатаю никак не могу врубиться каким образом происходит эта операция и что и куда она сдвигает? Где может использоваться? З.Ы. Ногами не бейти за глупый вопрос! Link to comment Share on other sites More sharing options...
Guest Форматцевт Posted February 16, 2006 Report Share Posted February 16, 2006 (edited) это побитовый сдвиг, применяется для маскирования, ну расчета сигнатуры, кс ....много для чего это для аппаратных вещей в основном. Edited February 16, 2006 by Форматцевт Link to comment Share on other sites More sharing options...
Симаргл Posted February 16, 2006 Author Report Share Posted February 16, 2006 Побитовый сдвиг? Т.е., к примеру, есть символ 'A' - у него 8-ми битный код, к примеру - 01011101 Применим к нему операвцию сдвига и что получим? Символ изменится? Т.е. для шифрования может применятся? Link to comment Share on other sites More sharing options...
Guest Форматцевт Posted February 16, 2006 Report Share Posted February 16, 2006 01011101 10111010 01011101 00101110 Link to comment Share on other sites More sharing options...
Shurr Posted February 16, 2006 Report Share Posted February 16, 2006 Операция двоичного сдвига легко обьясняется, если ты знаком с двоичной системой счисления. Суть операции сдвига состоит в изменении позиции каждого бита на фиксированное число. Легче обьяснить на примере. Возьмем любое число, пусть будет 13. В двоичной системе счисления оно представляется как 1101. Сделаем сдвиг на 1 позицию влево. Т.е. четвертый бит станет пятым, третий - четвертым и т.д., на место первого вставим 0. Число превратится в 11010, т.е. 26 в десятичной системе счисления. Это тебе левый сдвиг на одну позицию. Сделаем сдвиг (исходного числа, т.е. 13) на 1 позицию вправо. Первый байт потеряется, остальные передвинутся. В итоге получим 110, т.е. 6 в десятичной. В принципе, можно рассматривать и десятичный сдвиг. Тогда при левом сдвиге 13 превратится в 130, а при правом - в 1. В общем случае при левом сдвиге число умножается на основание системы счисления, а при правом - делится (с потерей остатка). Теперь рассмотрим операцию сдвига в контексте программирования, где все данные хранятся в переменных с ограниченной длиной. Для примера возьмем переменную размером один байт (8 бит), и число 212, т.е. 11010100 в двоичной системе. При попытке сделать левый сдвиг мы обнаруживаем, что старший бит не влазит в размерность, т.е. становится 9-м битом (при максимуме 8). Для разрешения такой ситуации были введены две вариации сдвига: с потерей бита, и циклический. При сдвиге с потерей старшего бита - старший бит просто отбрасывается, и число 11010100 превратится в 10101000. При циклическом сдвиге "выпадающий" бит вносится на место первого, т.е. число 11010100 превратится в 10101001. Примерно та же ситуация и с правым сдвигом: первый бит либо теряется, либо становится восьмым. Также есть еще знаковый сдвиг, предназначенный для корректной работы со сдвигом отрицательных чисел, но это уже тонкости, которые для общего понимания не обязательны. Т.е. для шифрования может применятся? Не только может, но и очень часто применяется. Применяется вообще везде, где логической единицей данных является бит: анализ флагов, использование битовых масок... Также может использоваться для быстрого умножения и деления на числа, являющиеся степенями двойки. Link to comment Share on other sites More sharing options...
Симаргл Posted February 16, 2006 Author Report Share Posted February 16, 2006 Shurr: спасибо! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now