Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510

Практическое применение битовых операций

17.04.2024, 01:08. Показов 2407. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет
интересует практическое применение битовых операций в повседневности скажем так
то что побитовые сдвиги - умножение/деление на четное - это да.

а вот остальные операции - можно ли с их помощью как-то что-то ускорить,
например уменьшив объем передаваемых данных - к примеру использовать все биты байтов при радиопередаче,
вместо десятичной перейти на шестнадцатиричную систему

или например битовое "И" быстрее чем обычное "И".

какой вообще логический смысл СЕЙЧАС несут битовые операции, разумеется кроме явных моментов где их наличие необходимо: XOR и прочие операции с байтами?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.04.2024, 01:08
Ответы с готовыми решениями:

Применение битовых операций
Применение битовых операций: задачу решить, не используя арифметических операций +, , *, /, %. Написать программу, которая позволит ввести...

Практическое применение c++
Решил изучить с++, но столкнулся со следующей проблемой: как программы на этом языке применяются на практике? При изучении с# находил...

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

32
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,769
Записей в блоге: 14
17.04.2024, 20:39
Студворк — интернет-сервис помощи студентам
У меня старая Visual studio 6 (C++). Посмотрел дизассемблерный код... Я в шоке! C++ упорно не хочет использовать битовые операции! Удалось заставить это сделать только вот так:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
13:
14:       int p=3, q=1, n=45;
0040103B   mov         dword ptr [ebp-30h],3
00401042   mov         dword ptr [ebp-34h],1
00401049   mov         dword ptr [ebp-38h],2Dh
15:
16:       n=(n << p)+(n << q);
00401050   mov         eax,dword ptr [ebp-38h]
00401053   mov         ecx,dword ptr [ebp-30h]
00401056   shl         eax,cl
00401058   mov         edx,dword ptr [ebp-38h]
0040105B   mov         ecx,dword ptr [ebp-34h]
0040105E   shl         edx,cl
00401060   add         eax,edx
00401062   mov         dword ptr [ebp-38h],eax
А если с константами, то ...

Code
1
2
3
4
5
6
7
8
9
15:       int n=45;
0040103B   mov         dword ptr [ebp-30h],2Dh
16:
17:       n=(n << 3)+(n << 1);
00401042   mov         eax,dword ptr [ebp-30h]
00401045   shl         eax,1
00401047   mov         ecx,dword ptr [ebp-30h]
0040104A   lea         edx,[eax+ecx*8]
0040104D   mov         dword ptr [ebp-30h],edx
Тогда уж лучше без "оптимизации":

Code
1
2
3
4
5
6
7
15:       int n=45;
0040103B   mov         dword ptr [ebp-30h],2Dh
16:
17:       n=n*10;
00401042   mov         eax,dword ptr [ebp-30h]
00401045   imul        eax,eax,0Ah
00401048   mov         dword ptr [ebp-30h],eax
1
100 / 35 / 3
Регистрация: 09.03.2024
Сообщений: 96
Записей в блоге: 8
19.04.2024, 01:04
Цитата Сообщение от pup_kin Посмотреть сообщение
я имел ввиду
к примеру
C++
1
2
3
4
5
6
7
8
9
10
if(i == 1)
{
...
 
}
//или 
if(i&j)
{
...
}
Это вовсе не одно и то же.

if(i == 1) - истинно лишь в случае, когда значение переменной i в точности равно 1.

if(i&j) - истинно для всех нечетных i.
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
19.04.2024, 01:28  [ТС]
Цитата Сообщение от steelcraft Посмотреть сообщение
Это вовсе не одно и то же.
это я понял, меня это и смутило что у кого-то в коде с=здесь я увидел
передача в метод вместо осмысленной переменной значения
.метод(перем1 | перем2)
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
19.04.2024, 09:05
Лучший ответ Сообщение было отмечено pup_kin как решение

Решение

Цитата Сообщение от pup_kin Посмотреть сообщение
передача в метод вместо осмысленной переменной значения
.метод(перем1 | перем2)
Так это наверное была комбинация битовых флагов.
1
1518 / 533 / 78
Регистрация: 22.09.2023
Сообщений: 1,696
19.04.2024, 09:35
С битовыми флагами есть один нюанс: для операций "двоичное (побитовое) И" ("&"), "двоичное (побитовое) ИЛИ" ("|") порядок вычисления операндов не определен и выражение всегда вычисляется полностью. А для операций "логическое И" ("&&"), "логическое ИЛИ" ("||") порядок вычисления операндов строго слева направо и их вычисление прекращается, как только необработанные еще операнды перестают влиять на результат. Например, в выражении if(func1() || func2() || func3()) func3 не будет вызвана, если func2() вернет true, а func2() (и func3()) не будут вызваны, если func1() вернeт true.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
19.04.2024, 23:43  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Так это наверное была комбинация битовых флагов.
и что это значит?
это же ничего не значит

яж пишу пример


.метод(int принимает 1)

это перечисления
перем1 = 1
перем2 =2
перем3 =4


.метод(перем1 | перем2)
1|2 Это 3
вообще смысла нет
наверное очередной бредовый код был

Добавлено через 2 минуты
типа такого
C++
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
// Определение флагов для способностей
#define RUN   0b0001  // 1
#define JUMP  0b0010  // 2
#define SWIM  0b0100  // 4
#define FLY   0b1000  // 8
 
 
 
int main() {
    // Установка начальных способностей игрока: бег и прыжок
    int playerAbilities = RUN | JUMP; // 0b0011 или 3 в десятичном виде
 
    // Проверка, умеет ли игрок прыгать
    if (playerAbilities & JUMP) {
        printf("Игрок умеет прыгать!\n");
    } else {
        printf("Игрок не умеет прыгать.\n");
    }
 
    // Добавление способности плавать
    playerAbilities |= SWIM; // Теперь 0b0111 или 7 в десятичном виде
 
    // Проверка, умеет ли игрок плавать
    if (playerAbilities & SWIM) {
        printf("Игрок умеет плавать!\n");
    } else {
        printf("Игрок не умеет плавать.\n");
    }
 
    // Удаление способности бегать
    playerAbilities &= ~RUN; // Теперь 0b0110 или 6 в десятичном виде
 
    // Проверка, умеет ли игрок бегать
    if (playerAbilities & RUN) {

ааааа
они делали 11111111

теперь понятно
там внутри метода наверняка был оператор
"|="

спасибо
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
20.04.2024, 01:39
pup_kin, каждый бит обозначает некий признак. Бит в 1 - признак есть, бит в 0 - признака нет. Несколько битов - комбинация признаков. Т.е. суть именно в битах (и их комбинациях), а не в десятичных числах, которые они составляют.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.04.2024, 03:10
Цитата Сообщение от pup_kin Посмотреть сообщение
// Определение флагов для способностей
#define RUN   0b0001  // 1
#define JUMP  0b0010  // 2
#define SWIM  0b0100  // 4
#define FLY   0b1000  // 8
Ага : DoIt(RUN | JUMP | SWIM | FLY) = бегучи пригать нырьком в полёте
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
20.04.2024, 10:32
pup_kin, битовые флаги принесут пользу, если у вас будет множество персонажей с разными способностями... (т.е. несколько переменных "playerAbilities") а у вас в коде один игрок
0
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
20.04.2024, 18:27  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
а у вас в коде один игрок
да это не мой код,
это код из интернета нагугленный по "комбинация битовых флагов".


А вот вопрос такой дурацкий

битовые флаги - отлично, все хорошо, удобно 8 признаков или 32 можно запихать в одну переменную.

А вот вопрос-
код он же увеличится в объеме
к примеру
у меня есть объект у него свойство прыгает, бегает, летает, ползает

и если я пишу то тут все норм, булевский признак

C++
1
2
3
if(объект.лазает){ ....}
 
if(объект.бегает){...}
а если у меня будет


C++
1
2
3
4
5
6
7
8
9
#define jump 0b0001  
#define swim 0b0010
 
 
//И соответственно условия 
 
if(объект.наборсвойств | jump){ ....}
 
if(объект.наборсвойств | swim){...}
не увеличит ли это конечный размер кода , сведя тем самым на нет тот крапаль выгоды в битах который я получу

к тому же наличие дефайнов - оно же тоже где-то хранится?

насколько это выгодно.
И сравнение будева условия и битового "И" что из них менее затратно?

или это все зависит от конкретного компилятора и платформы для которой собирается проект?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
20.04.2024, 18:46
Цитата Сообщение от pup_kin Посмотреть сообщение
к тому же наличие дефайнов - оно же тоже где-то хранится?
Нет. Сама константа будет в команде, а дефайны сами по себе нигде не хранятся. Это информация времени трансляции.

Цитата Сообщение от pup_kin Посмотреть сообщение
не увеличит ли это конечный размер кода , сведя тем самым на нет тот крапаль выгоды в битах который я получу
В x86, например, есть инструкция TEST специально для проверки битовых флагов.
Так что не увеличит.

Цитата Сообщение от pup_kin Посмотреть сообщение
C++
1
2
if(объект.наборсвойств | jump){ ....}
if(объект.наборсвойств | swim){...}
Толькол &, а не |

Добавлено через 5 минут
Цитата Сообщение от pup_kin Посмотреть сообщение
И сравнение будева условия и битового "И" что из них менее затратно?
Одинаково если проверять по-одиночке.
Если же например надо будет проверить сразу пачку признаков, то через тот же TEST будет быстрее.
А булевские флаги будут проверяться по-отдельности, еще и переход добавится.
1
16 / 18 / 2
Регистрация: 02.03.2024
Сообщений: 510
20.04.2024, 20:13  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В x86, например, есть инструкция TEST специально для проверки битовых флагов.
это про это имеется ввиду
https://av-assembler.ru/instru... 0%BB%D0%B0.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
20.04.2024, 20:14
pup_kin, про это.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.04.2024, 20:14

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

Реализация битовых операций
IntA=10; A=A&amp;0F; A=A|03; A=A&lt;&lt;1 Чему будет равно A?

Реализация битовых операций в Си++
По теме: Реализация битовых операций в Си++. Даны два неравных числа: n и m, не превосходящие 31. Вычислите 2^n+2^m.

Выполнение битовых логических операций
Вот такой пример: // BitTest — инициируются две переменные и // выводятся результаты выполнения // операторов ~,&amp;,| и ^ ...

Практическое применение классов без создания объектов этого класса
Приветствую всех! Читай книгу Р. Лафоре &quot;ООП в C++&quot; увидел вопрос: &quot;Истинно ли следующее утверждение: иногда полезно создать класс,...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru