Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2021, 14:16   #1
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию Что делает этот код?

Привет. Я вчера был на олимпиадну, и на вопросе был такой код:
Код:
a = -1
a = a >> 1
print(a)
Что она выводит? А именно, что делает выражение "а >> 1"?
FsGaCh вне форума Ответить с цитированием
Старый 12.02.2021, 14:18   #2
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

# '>>' сдвиг вправо, сдвигает биты числа вправо на заданное число позиций
# 11 >> 1 даст 5, в двоичном виде 11 представляется как 1011, что будучи смещённым на 1 бит вправо, даёт 101, а это, в свою очередь, не что иное как десятичное 5
# '<<' сдвиг влево, сдвигает биты числа влево на заданное количество позиций
# любое число в памяти компьютера представлено в виде битов - или двоичных чисел, т. е. 0 и 1
# 2 << 2 даст 8, в двоичном виде 2 представляет собой 10, сдвиг влево на 2 бита даёт 1000, что в десятичном виде означает 8
Ципихович Эндрю вне форума Ответить с цитированием
Старый 12.02.2021, 14:19   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

лично для меня тяжеловато в восприятии, многим нравится
Ципихович Эндрю вне форума Ответить с цитированием
Старый 12.02.2021, 20:08   #4
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Понял, спасибо.
FsGaCh вне форума Ответить с цитированием
Старый 13.02.2021, 16:23   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Ну а что бы понятнее было, то:
Операция сдвига вправо >> - это целочисленное деление на 2;
Операция сдвига влево << - это целочисленное умножение на 2.

PS:
Не сразу сообразил, почему:
Цитата:
# 11 >> 1 даст 5
Но потом понял, что: # 1110 >> 1 даст 510
Кстати, у ТС сдвигается -1.
При сдвиге влево младший бит заполняется нулём, а при сдвиге вправо старший бит заполняется знаком числа. Т.е., если число положительное, то старший бит заполняется нулём, а если отрицательное, то - 1 (единицей).
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 13.02.2021, 16:28   #6
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

не понятно, чем не нравится обычное представление записи таких операций, ещё может на иероглифами, смайликами писать будем? там вроде один знак - а смысла намного больше, + эмоции, на любителя........
Ципихович Эндрю вне форума Ответить с цитированием
Старый 16.02.2021, 22:18   #7
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Тогда -1 >> 1 будет 0 да?
FsGaCh вне форума Ответить с цитированием
Старый 16.02.2021, 22:49   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Цитата:
Тогда -1 >> 1 будет 0 да?
Это из каких рассуждений следует?
Рассмотрим только один нибл.
В этом случае 110 = 00012.
-110 = 1110+1 = 11112 - перевели в дополнительный код.

Сдвиг вправо на один бит даст снова 1111, т.к. старший бит размножается.
Т.е. -110.
Запусти IDLE и попробуй.
Сдвиг на любое число бит вправо оставит -1.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что делает этот код Nastya2018 Общие вопросы по Java, Java SE, Kotlin 1 13.01.2019 23:54
Что делает этот код? Andrew Garfield Общие вопросы по программированию, компьютерный форум 9 17.03.2017 16:28
Что это ? Что и как делает этот код? Dimka-novitsek Общие вопросы C/C++ 1 03.05.2015 01:57
Что делает этот код? Alex_sim Общие вопросы C/C++ 10 03.03.2010 23:45
Что делает этот код? lucky Общие вопросы Delphi 4 17.06.2009 17:02