Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 17.09.2020
Сообщений: 1

Правильно ли я понимаю код?

12.02.2023, 14:11. Показов 3434. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Наткнулся на просторах Интернета на функцию, которая необходима мне для решения задачи. Функция получает бит из числа типа double и имеет следующий вид:
C
1
2
3
4
5
6
7
8
9
10
 
bool getBit(double * d, int bit){
 
        unsigned mask=1<<bit;
        bool res;
        if (bit >32) 
            res=(*((unsigned *)d+1))&mask;
        else res=(*(unsigned *)d)&mask;
        return res;
}
Функция прекрасно работает, но я сомневаюсь, что окончательно понял, что делает каждая строка. Ниже привожу свои рассуждения, прошу проверить их на правильность:

Первая строка понятна: создаем маску битовой операцией.

Вторая строка тоже, очевидно, понятна.

Затем идет ветвление. При номере бита меньше 32 мы берем указатель на переменную d, присваиваем ему тип unsigned, затем разыменовываем и, что тоже понятно, "логически умножаем" на маску. Хотелось бы понять, что делает конструкция (*(unsigned *)d). Насколько я понял, она рассматривает участок памяти, выделенный под d, но представляет его как будто бы d - число типа unsigned. А затем происходит уже само сравнение с маской. При бите больше 32 мы смотрим следующие 4 байта, так как unsigned занимает в памяти 4 байта, а double - 8.

Также не очень понятно, почему программа не работает с "переводом" d в unsigned long long, который тоже занимает 8 байт, что помогло бы избежать ветвления.

Прошу Вас оценить мои рассуждения, и исправить меня, если где-то я неправ.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.02.2023, 14:11
Ответы с готовыми решениями:

Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет.
#pragma once namespace Casper { class Cat { private: unsigned int age; float weight;

есть код функции который шифрует строку,я правильно понимаю что если в строке
есть код функции который шифрует строку,я правильно понимаю что если в строке: answer.append(chr(ord(s) ^ ord(k))) убрать функции chr и ord...

Правильно ли я понимаю, что XmlTextWriter весь получаемый текст при выводе транслирует в HTML-код?
Правильно ли я понимаю, что XmlTextWriter весь получаемый текст при выводе транслирует в HTML-код, т.е. &quot;&amp;&quot; заменяет на...

27
 Аватар для peter_irich
371 / 227 / 53
Регистрация: 18.10.2017
Сообщений: 2,436
15.02.2023, 08:34
Студворк — интернет-сервис помощи студентам
TheCalligrapher, вполне определённое поведение. double - 8 байтов, unsigned - 4 байта, за пределы double функция не выходит.
Хотя, конечно, надёжнее u_int32_t.
Надо ещё узнать о существовании stdbool.h. Мне в программах на C редко когда требовался тип bool, а когда требовался,
я подключал свой bool.h. И вообще адресуемой единицей является не бит, а, скажем, 4 байта, так что я не вижу выигрыша
в использовании _Bool.
Вот для меня самоочевидно, что исходный код - профессиональный, а предложенные варианты - наскоро сделанные поделки.
0
фрилансер
 Аватар для Алексей1153
6503 / 5746 / 1134
Регистрация: 11.10.2019
Сообщений: 15,391
15.02.2023, 08:41
peter_irich, вот на русском языке. Вникай, пригодится. Нет смысла упираться рогом, а потом удивляться, что программа не работает внезапно
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13216 / 6848 / 1826
Регистрация: 18.10.2014
Сообщений: 17,369
15.02.2023, 09:19
Цитата Сообщение от peter_irich Посмотреть сообщение
вполне определённое поведение. double - 8 байтов, unsigned - 4 байта, за пределы double функция не выходит.
Хотя, конечно, надёжнее u_int32_t.
Это не важно, выходит или не выходит. В языке С открытым текстом запрещается накладывать (=осуществлять доступ) unsigned на память, занятую double (кроме как через union).

Цитата Сообщение от peter_irich Посмотреть сообщение
а когда требовался, я подключал свой bool.h
Это не важно, что вы там где-то когда-то делали. Тут у нас не вечер удивительных историй. Правила просты: если в форуме в отрывке кода используется bool и не оговорено иначе, то это bool из <stdbool.h>, ссылающийся на _Bool. Все остальное - это пустая болтовня ни о чем.

Цитата Сообщение от peter_irich Посмотреть сообщение
Вот для меня самоочевидно, что исходный код - профессиональный, а предложенные варианты - наскоро сделанные поделки.
^^^ Я думаю, уже понятно, что данный персонаж просто флудит/троллит форум путем повторения одной и той же чуши. Нет смысла дальше тратить время.
0
 Аватар для peter_irich
371 / 227 / 53
Регистрация: 18.10.2017
Сообщений: 2,436
15.02.2023, 13:41
TheCalligrapher, если и запрещается, в рассматриваемом случае это вреда не причиняет.
0
15.02.2023, 15:27

Не по теме:

Цитата Сообщение от peter_irich Посмотреть сообщение
если и запрещается, в рассматриваемом случае это вреда не причиняет.
Что и говорил. Как об стенку горох... ¯\_(ツ)_/¯

0
 Аватар для peter_irich
371 / 227 / 53
Регистрация: 18.10.2017
Сообщений: 2,436
15.02.2023, 21:32
TheCalligrapher, я твёрд умом. И не вижу разницы, получать доступ через указатель или через union.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13216 / 6848 / 1826
Регистрация: 18.10.2014
Сообщений: 17,369
15.02.2023, 21:36
Цитата Сообщение от peter_irich Посмотреть сообщение
И не вижу разницы, получать доступ через указатель или через union.
В этом-то "не вижу" проблема и заключается. А спецификация языка С открытым текстом говорит: через union - можно, а через указатель - нельзя.

Почему такое накладывание типов друг на друга не разрешается в языке (кроме специально оговоренных способов) - тема тоже вполне понятная. Это позволяет компилятору существенно лучше оптимизировать код.
0
 Аватар для peter_irich
371 / 227 / 53
Регистрация: 18.10.2017
Сообщений: 2,436
15.02.2023, 22:54
TheCalligrapher, в данном случае требовалось только прочитать.
Какая разница, читать unsigned int откуда-то из памяти или из явно отведённого места, что тут оптимизировать.
Это в DOS были сегменты и способы адресации.
На вид исходный вариант проще, но насчёт оптимизации ничего утверждать не могу.
Я и сам использую union.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2023, 22:54

Нашел код, он рабочий но я его не понимаю. Объясните код пожалуйста
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using...

исправьте код или напишите заново код пожалуйста(не совсем понимаю,как это делать)
В стандартный поток ввода подается поочередно две строки. Первая содержит только букву латинского алфавита. 3атем подается строка,...

Правильно ли я понимаю while(!s)
Я знаю если условие такое while(s){ //истинно. } то пока истинно выполняется, а если while(!s){ //не истинно } ...

ВЧ СЧ НЧ Правильно ли я понимаю?
ВЧ СЧ НЧ Правильно ли я понимаю? К примеру тематика живопись ВЧ - это живопись, рисунки СЧ - (это то что есть на сайте ,...

я правильно понимаю?
если надо вывести в топ не главную страницу например http://site/имя страници.html то ссылки надо ставить на эту страницу...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru