Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
13 / 2 / 2
Регистрация: 17.10.2012
Сообщений: 57

Побитовые операции Python

12.08.2017, 20:06. Показов 1848. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В С++ имеется модернизированная функция округления:
C++ (Qt)
1
2
t = ((xd) + 6755399441055744.0);
   return *((int *)(&t));
Хотелось бы переписать это на Python 3. С побитовыми операциями, насколько можно судить из исходника, в Python не натыкался. Буду рад любым наводкам на возможность использования данной фичи в питоновской версии.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.08.2017, 20:06
Ответы с готовыми решениями:

Побитовые операции в Python
Дано короткое целое неотрицательное число. Определить в его двоичном представлении максимальное количество расположенных рядом единиц.

Python побитовые операции
Не могу разобрать задачи уже который день, help. Задачи даны под C, но написать их нужно под Python. Искал ответы по форуму, есть похожие...

Побитовые логические операции и операции смещения
Составить две программы, первая из которых вводит составные части структуры данных и формирует из них заданную упакованную структуру....

15
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.08.2017, 20:10
Lokomoss, зачем тебе в python округление делать с помощью побитовых операций? Для этого есть специальная функция.
0
13 / 2 / 2
Регистрация: 17.10.2012
Сообщений: 57
12.08.2017, 20:25  [ТС]
Из-за extension c C++ либой.
Но в принципе можно и питоновское округление брать. правда round не совсем катит
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.08.2017, 20:33
Цитата Сообщение от Lokomoss Посмотреть сообщение
правда round не совсем катит
Из-за чего?
0
in code we trust
 Аватар для __py__
133 / 162 / 12
Регистрация: 29.02.2016
Сообщений: 885
12.08.2017, 21:57
Вообще побитовые операции применяются для оптимизации кода. Допустим побитовое 200000**200000 выполняется примерно в 1000 эффективнее обычного.
Почти весь рабочий код у меня в винде остался, кроме готовых программ (заходить туда неохота (и долго из под debian)).
Согласен, что побитовое округление глупость в python.
Пример кода есть в 1 части туториала по алгоритмам здесь.
https://classroom.udacity.com/... 7024270923
К примеру этот код путём побитового сдвига << выполняется мгновенно, в отличие от обычного вычисления.
Python
1
2
3
4
def xx():
    i = 200000
    return print(i**i)
xx()
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.08.2017, 22:29
Цитата Сообщение от __py__ Посмотреть сообщение
Вообще побитовые операции применяются для оптимизации кода.
В python оптимизации от этого 0, уже проверял.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
12.08.2017, 22:42
Цитата Сообщение от __py__ Посмотреть сообщение
Допустим побитовое 200000**200000 выполняется примерно в 1000 эффективнее обычного.
Я извиняюсь, но где здесь, простите, побитовая операция?
**
Может все-таки это побитовые операторы?

-----------------------
Цитата Сообщение от Lokomoss Посмотреть сообщение
В С++ имеется модернизированная функция округления
Нет такой функции в С++. Это обычное шаманство с "волшебными" числами.

По части округления: а пацаны и не знают - в python битовые операции только для int.
1
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.08.2017, 22:48
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import timeit
 
 
def test1():
    for num in range(10000000):
        if (num & 1) == 1:
            pass
        else:
            pass
 
 
def test2():
    for num in range(10000000):
        if (num % 2) == 0:
            pass
        else:
            pass
 
print(timeit.timeit("test1()", setup="from __main__ import test1", number=100))
print(timeit.timeit("test2()", setup="from __main__ import test2", number=100))
Результаты
68.15443362900987
58.12555265601259

Результаты говорят сами за себя.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
12.08.2017, 22:59
alex925,
В разделе алгоритмов был холивар на эту тему и было высказано мнение что "для оценки времени исполнения ОДНОЙ АППАРАТНОЙ ОПЕРАЦИИ нужно читать документацию на процессор".
То есть в данном случае считаются всякие накладные расходы (на цикл, на процедуру измерения времени), а интересующая операция попадает чуть ли не в флуктуацию. Поэтому замерять скорость квантовых операций таким способом бесполезно.

Добавлено через 49 секунд
Цитата Сообщение от Garry Galler Посмотреть сообщение
Я извиняюсь, но где здесь, простите, побитовая операция?
Вопрос снят. Не увидел <<.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.08.2017, 23:22
Garry Galler, Это не поможет, потому что мы говорим о очень высокоуровневом языке и в нем на все операции налагается большое количество накладных расходов. Я уверен, что тут не будет ничего выполняться в 1 аппаратную операцию.
Данный замер показывает не точное время, а то, что идея высказанная выше не работает в Python. В шарпе и остальных языках в которых слой абстракций меньше это будет работать, но не здесь.
0
in code we trust
 Аватар для __py__
133 / 162 / 12
Регистрация: 29.02.2016
Сообщений: 885
13.08.2017, 00:07
если кому надо то вот код из того курса,
но что-то мне эта оптимизация тоже начинает казаться излишним для python
Python
1
2
3
4
5
6
7
8
9
10
11
def ru(a, b):
    x = a
    y = b
    z = 0
    while x > 0:
        if x % 2 == 1:
            z = z + y
        y = y << 1
        x = x >> 1
    return z
print(ru(1800**1800, 1800**1800))
Добавлено через 10 минут
( 2 час ушло на запуск винды и ковыряние кода в ней )
иду обратно в debian
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.08.2017, 00:20
Цитата Сообщение от __py__ Посмотреть сообщение
2 час ушло на запуск винды и ковыряние кода в ней
Открою маленький секрет, из линухи ты свободно можешь ковыряться в виндовых разделах.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
13.08.2017, 01:42
Цитата Сообщение от alex925 Посмотреть сообщение
идея высказанная выше не работает в Python. В шарпе и остальных языках в которых слой абстракций меньше это будет работать, но не здесь
Тут-то я как раз согласен, просто именно поэтому пробовать замерять скорость выполнения одних операторов и сравнивать с другими тоже не вариант. У одного одни результаты получатся, у другого другие и каждый будет думать, что его результаты более правильные. Хотя на самом деле - просто некий рандом :-)
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.08.2017, 06:57
Lokomoss, Extending Python with C or C++. Так напишите функцию на c++ и скомпилируйте как библиотеку.
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
13.08.2017, 10:21
Python
1
int(6755399441055744.0 + xd) & 0xffff
Как уже сказано - сие шаманство есть; работает для чисел меньших 2**31 - 1, отрицательные надо abs'ить (little-endian, 32-битный int).
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
13.08.2017, 15:38
Цитата Сообщение от Lokomoss Посмотреть сообщение
t = ((xd) + 6755399441055744.0);
* *return *((int *)(&t));
Если быть точным, то это не округление, а преобразование.
Если перевести "шаманский" код на python (в посте shsv само собой вариант короче), но в стиле Си, то будет примерно так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from ctypes import c_double,pointer,cast,POINTER,addressof,c_int,c_float
 
# преобразование double to int\float
def dtoi(num,float_=False):
    t = c_double(num + 6755399441055744.0)
    ptr_int = cast(addressof(t),POINTER(c_int)) # ((int *)(&t))
    if float_:
        res = c_float(ptr_int.contents.value).value
    else:
        res = ptr_int.contents.value
    return res
 
# А так в С++ извращаются для округления до нужного числа знаков, используя предыдущий код в качестве основы 
# округление до нужного числа знаков 
 
def round2(f,ndigits=0):
    digits = 10 ** ndigits
    rf = dtoi(f) 
    t = (f - rf) * digits; 
    return rf + (dtoi(t)/digits) 
 
print('dtoi:',dtoi(2.2345))  # 2 
print('dtoi:',dtoi(1.255))   # 2
print('dtoi:',dtoi(2.355))   # 2
print('dtoi:',dtoi(2.500))   # 2
print('dtoi:',dtoi(2.511))   # 3
print('dtoi:',dtoi(2.999))   # 3
 
print('round2:',round2(2.2345,2)) # 2.23
print('round2:',round2(2.255,2))  # 2.25  - неверно!
print('round2:',round2(2.355,2))  # 2.36  - верно
print('round2:',round2(2.500,2))  # 2.5
print('round2:',round2(2.511,2))  # 2.51
print('round2:',round2(2.999,2))  # 3.0
 
# 1.355 не округляет до двух знаков
print('round2:',round2(1.355,2))   #1.3599999999999999
P.S. Как видно из результатов, самописные варианты допускают ошибки.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2017, 15:38
Помогаю со студенческими работами здесь

Побитовые логические операции и операции смещения
Составить две программы, первая из которых вводит составные части структуры данных, приведенных в варианте индивидуальной задачи, и...

побитовые операции/операции с битами
Написать шифр который знак на две половины(4 + 4 бита) , в первой половине биты разделить на две пары и их значения в паре заменить...

Побитовые операции
Задача: Ввести последовательность из 8 символов. Если символ – восьмеричная цифра, то заменить в нем бит, номер которого совпадает с этой...

Побитовые операции
Сделать описание программы Препод сильно валит и просит все делать по методичке(объяснения), но его не устраивают эти объяснения ...

Побитовые операции
Как вычислить такое: 1). 3|6 2).3&amp;6? Добавлено через 10 минут 3).3&amp;&amp;6. 4).5&lt;3+8. 5).5&gt;3+8 Добавлено через 19 секунд ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru