КАК РАБОТАТЬ С БИТАМИ | ОСНОВЫ ПРОГРАММИРОВАНИЯ
Вставка
- Опубліковано 2 чер 2024
- Начни изучать программирование на курсе Frontend-разработчик от Хекслет bit.ly/38He0f1
А чтобы получить скидку 10% - сообщи менеджеру или в чат поддержки кодовое слово AlekOS
🧠 MindBooster от Nooteria Labs: ноотропный комплекс для улучшения внимания, памяти, мотивации и работы мозга: vivaherb.ru/product/mindboost...
Битовые операции.
Из-за того, что в компьютерах используется байтовая адресация, мы вынуждены выделять в памяти минимум 8 бит.
Однако есть задачи, в которых память критична, а размер данных настолько мал, что можно обойтись и битами.
В этом видео показано как работать с каждым битом в отдельности, и в какую структуру данных всё это выльется.
Подписывайся в соц. сетях:
Телеграм - t.me/Alek_OS
ВК - alekos1
Яндекс Дзен - zen.yandex.ru/id/62220edf240e...
❤️ Поддержка канала:
Бусти - boosty.to/alekos
Юмани - yoomoney.ru/to/410011179144828
Патреон - / alekos1
✔️ Полезные ссылки:
Основы программирования - • КАК РАБОТАЕТ ПАМЯТЬ КО...
Полезно знать - • ЯЗЫКИ ПРОГРАММИРОВАНИЯ...
00:00 Введение
02:19 Логические операторы
03:04 РЕКЛАМА
04:41 Битовые операторы
06:03 Сжатие аргументов
07:44 Узнать содержимое бита
08:26 Установка бита в 1
09:02 Установка бита в 0
09:20 Инверсия бита
10:03 РЕКЛАМА
11:31 Функции для работы с битами
12:01 Битовые сдвиги
13:02 Арифметический сдвиг
15:12 Логический сдвиг
15:40 Циклический сдвиг
16:05 Особенности битовых сдвигов
19:05 Дописываем функции для работы с битами
20:37 Битовый вектор
Телеграм - t.me/Alek_OS
ВК - vk.com/alekos1
Яндекс Дзен - zen.yandex.ru/id/62220edf240e7221b567946a
Как работать с битами?
Делать музыку!
@василий сентяй Во первых я ничего не говорил про С++.
Math.floor здесь для наглядности, чтобы когда человек будет писать на своем языке или делить без сдвига, потом не ломал голову почему что-то не работает.
@василий сентяй ок
С битами лучше беззнаковыми целыми работать, но как я понял, в скриптовых ЯП их нет, а в Луа их совсем не было, до версии 5.3.
Особенно нравится графический стиль подачи. Да и содержание на уровне, без воды. Хоть я и достаточно опытный в этой теме, обязательно буду делиться с начинающими вашими уроками. Спасибо.
лесом его, узкая сфера
@@smykoilузкое у тебя мышление, а сфера фундаментальная.
@@user-nl1ff5zc9d хд, буквально несколько дней назад посмотрел урок по си у гоши дудоря, и еще немного поизучал. изменил свое отношение ко многим вещам)
Ура! Учиться!
Как всегда отлично, Алек. Спасибо за очередной просвещающий ролик. Очень прощу продолжить серию роликов о Ассемблере, спасибо.
Ошибка в видео.
В C++ операторы > - это логический сдвиг. Говорю, как программист железячник, который пишет код, наполовину состоящий из всевозможных битовых операций. Ибо у железа полно специальных регистров управления, где различные биты отвечают за работу тех или иных функций железа.
В свое время частенько спотыкался на этом, когда делил числа посредством сдвига. Знак терялся и в итоге я ловил баги.
Арифметический сдвиг вправо в С++ производится посредством оператора деления на число 2 в степени N, где N - количество битов, на которое нужно произвести сдвиг. Впрочем, некоторые ядра, например ARM, поддерживают инструкции для всех трех видов сдвига. Их либо использует компилятор в зависимости от контекста, либо программист пишет ассемблерные вставки, либо использует intrinsic функции (инструкции процессора, выраженные в виде функций), если таковые имеются в библиотеке программируемой платформы.
По поводу преобразования абсолютного индекса искомого бита в индексы строк и колонок. Тут вообще все просто. Колонок у нас 32. Берём младшие шесть бит абсолютного индекса (режем операцией И) - это у нас будет номер бита в конкретной "строке".
Берём старшие 26 бит абсолютного индекса (логический сдвиг на шесть бит вправо) - это у нас будет номер "строки" (индекс массива)
Погоди, в смысле полно регистров управления, он же только 1, не?
@@nakidai Железу выделяется участок физического адресного пространства для всевозможных управляющих регистров и аппаратных буферов. Регистры физически находятся в железке, а процессору они представлены как участок памяти. Но это не просто память, так как запись данных в неё меняет поведение железа. Если это, к примеру, звуковуха, то она требует конфигурацию. Например, разрядность аудиоданных, битрейт, громкость, эффекты, микширование и прочее.
Все эти конфиги пишутся драйвером в привязанный за железом адресный блок. Производитель железа может сделать разные регистры со всевозможным функционалом. Но чтобы операционная система могла работать с тем, что производитель навыдумывал, производитель пишет драйвер. Драйвер можно представить как некий код, где с одной стороны у него торчит стандартный API, через который его дёргает операционка, а с другой стороны драйвер дергает железо через его регистры.
@@kardanium А, то есть у любого подключаемого к матеру устройстве есть свои регистры? Спасибо, буду знать
Лучший коммент, дополню его
int - это не 32 бита
практика умножать/делить сдвигами, это ужасно, Если вам нужно умножать или делить, то именно это и делайте, а сдвиги оставьте для тех мест, где они определяют алгоритм. В 99,9% случаев оптимизатор компилятора сам догадается, что где-то можно оптимизировать операцию, если это технически возможно, а путать колег - не хорошо.
также при передаче параметров в функцию тремя битами упакованными в байт, удобней внутри функции не вынимать уже их, а сразу организовать табличный переход к функциям по адресам (автоматное программирование) и быстрее и удобней выйдет, иначе экономия двух байт на стеке при передачи параметров очень странно выглядит.
@@DmitroVialkov Практика умножать/делить сдвигами - это нормально в покоцанных архитектурах, вроде ARM Cortex-M0, так как ни умножать, ни делить они не могут, либо это обойдется слишком расточительно в плане доступных ресурсов, либо в производительности. Или еще хуже - в разработке аппаратных вычислителей под FPGA или ASIC. Там вообще подход "берем старшие N битов результирующего вектора и..." Компиляторы крайне редко оптимизируют вычислительные операции. И уж точно не заменяют "X / 2^N" на "X >> N", даже если целевой процессор не умеет делить аппаратно.
На счет шести бит я ошибся. Число 31 вмещается в пять бит. Значит нужно взять младшие пять бит индекса. В реальности ничто не мешает использовать в C++ типы фиксированной ширины: int16_t, int32_t, int64_t вместо int. Но если хочется индекс типа int, то и это не проблема:
uint32_t bits[8]; // наши биты
int index = 129; // Номер бита, который хотим инвертировать. Нумерация начинается с нуля.
// Младшие пять бит индекса в качестве номера "колонки":
int column = index & 0x1F;
// column = 1
// Старшие биты индекса в качестве номера "строки":
int row = (index & ~0x1F) >> 5;
// row = 4
// Инвертируем 129й бит
bits[row] ^= 1
Мощно, так продолжать, спасибо за столь твою кропотливую работу!
И так как работать с битами. Открываешь Abletone, расставляешь кики, снейры, хеты, берёшь семпл, понижаешь его на актаву вниз, 808. Готово.
А вы не про эти биты, ну тогда погнал
О, спс, я теперь написал кадилак 2.0
Больше спасибо, желаю интенсивного развития твоего канала (рост подписчиков и просмотров)! Это было классно!
Единственный человек, который смог мне доходчиво объяснить логику побитовых сдвигов! Я в восторге. Благодарю
Очень классное и полезное видео, я даже оторвался от программирования, чтобы коммент написать
Понятное и простое объяснение сложной темы! Спасибо.
Великолепно изложено, а главное своевременно! Алекс, будь здоров и успешен в своих делах и начинаниях!
ООО, новый видосик, сенкс
лайк авансом, посмотрю после других роликов
Спасибо за годный контент!!
Шикарно! Всё на высоте! Огромное спасибо!
Огромное спасибо за этот материал! Всегда были некоторые сомнения во время использования побитовых сдвигов и операций над битами, а здесь предствалена вся необходимая информация! Низкий поклон за разбор!
Очень круто и понятно. Я в асме работал с битами, но вот тут получил хорошие практические примеры и понимание, как можно в высокоуровневых языках делать разные манипуляции. Вроде и знаешь про операции и битовые маски, но когда видишь практические примеры, то всё сразу по полочкам раскладывается. Спасибо огромное за твой труд!
Спасибо огромное! Alek - вы лучший!
Спасибо за твою работу! Лучший в своем деле)
Красавчик, продолжай в том же духе! Ты делаешь правильное дело, спасибо!!!
Очень ждал новое видео, спасибо.
P.S. следующее видео по Assembler-у?
@@thetraveler7779 да (продолжение), в кометариях Alek недавно вроде писал, что после следуещего будет видео про Assembler
@@thetraveler7779 почему? если я правильно догадываюсь о чем идет речь, то в прошлом видео использовал MASM
@@rorva Из-за возможной блокировки ютуба ассемблер пришлось перенести. Если всё будет норм, то в июне скорее всего он появится.
@@AlekOS Спасибо за ответ)
Большое спасибо! Просто и наглядно, объяснить понятнее, наверное, невозможно
Посмотрю позже когда будет время, лайк сразу ! Знаю что контент годный 👍
Привет.
Ты один из лучших!!!
Спасибо тебе за создаваемое!
Полезно и интересно, с прекрасной подачей. Спасибо^^
Просто невероятное обьяснение материала ! Очень и очень круто и приятно смотреть!
В этом видео прекрасно всё) За 25 минут всё понятно, не представляю сколько понадобилось бы времени в универе с заснувшим преподом
Огромное спасибо за такой разборчивый видео урок ,хоть он и тяжёлый для усвоения новичку ,ещё раз огромное спасибо
Просто супер! Очень интересно! Спасибо
В микроконтроллерах это повсеместно используется:)
Прекрасное оформление видео и визуализации идеи, продолжай в том же духе)
Очень крутая подача и сразу видно, что с нами общается знаток своего дела. Жду продолжения уроков на ассемблере, ведь одного урока недостаточно)
*Спасибо! Очень информативно разобрал интересный кейс, благодаря тебе я узнал много нового!*
Спасибо, стало гораздо понятнее!)
Большое спасибо за урок!
Спасибо за уникальный контент (хоть порой не сразу удаётся его воспринять)
спасибо большое за контент, был на собеседовании в институт задали вопрос по теме, и как раз пригодится этот ролик.😊
Великолепные видео у тебя.Ставлю лайк перед просмотром.
следующий ролик от Алека будет о том как руками двигать электроны в компьютере :D
в общем просто спасибо тебе Алек за то что ты есть и что снимаешь такой нужный контент )
Спасибо большое! Очень интересное видео! Определенно лайк👍👍👍
Спасибо что живой
Спасибо за видеоролик!
Ты супер! Это то чего реально не хватало на русскоязычном Ютубе.
Категорический лайк👍 подписался ещё с видео про ассемблер❤
Раньше мне не приходилось ещё работать с битовыми операциями. И вот неделю назад появилась потребность... Решил получше разобраться в этой теме, читал информацию пару часов... И через неделю ты выпускаешь ролик по этой теме... Совпадение? Не думаю! Контент как всегда крутой! Мне нравится, как ты преподносишь информацию! Очередной годный ролик на актуальную тему.
Это лучшие в наблюдаемой вселенной ролики!
Спасибо за видео.Коммент в поддержку!
Лайк. Полезная инфа. Спасибо тебе.😉
Прекрасная работа!
Спасибо за очень интересный Ваш материал ..!!
Кратко и полезно!
отлично! дай те бог!
Хоть ничего нового не узнал, но освежить знания было самое то. 👍👍
Отличный ролик. Проходил это в мшп и думал, что никогда не понадобится, но здесь приведены отличные примеры
Отличный ролик!
Просто и понятно, спасибо вам
Лучший, отличная визуализация
СУПЕР КЛАСС !!! СПАСИБО !!!!!!!!!!!!
Лайк, очень полезно!
Лучший ролик про битовые операции и их использование в СНГ ютубе.
Полезное видео!
Круто, не совсем все понял, но понял что побитовые операторы довольно полезная штука)
Если программируешь микроконтроллеры побитовые операторы используется постоянно
Отличное изложение материала👍
это точно
Шикарная подача. Продолжай дальше. Удачи в начинаниях. Что за мелодии в роликах?
Приятный голос, внятная речь, грамотная подача материала, все нравиться. Просьба если можно чуть, чуть тише фон музыки. Спасибо огромное!
Замечательно. Куча сэкономленного времени. Отличный материал
Лайк, так держать, отличная подача материала! В видео не был проговорён один важный момент - во многих языках программирования && и || -укороченные(еще называют операторы короткого замыкания) формы логических операторов И и ИЛИ. Отличие от побитовых(| и &) состоит в том, что второй операнд у них вычисляется лишь в случае необходимости. Т.е если левый оператор в выражении &&-ложь, то второй оператор уже не вычисляется. Что касается примера в конце, то числа в массиве numbers ограничены 8192 при размере readed в 256. Размер readed можно не указывать, да и ячейки в readed будут использованы только кратные степени двойки-1. В качестве показа магии упаковки битов в ячейки int такой велосипед конечно сгодится. А если в numbers будет 0, то можно дописать int row = index!=-1?getRow(index)+1:0; Для col аналогично.
Спасибо, очень полезно и информативно!
А будет ли продолжение про язык ассемблера?
офигенное видео
Этим видосом ты спас меня от выгорания, спасибо.
Арифметический сдвиг числа -1 тоже ведь попадает под правило деления. Допустим мы сдвигаем -1 на один бит вправо, т.е. делим на 2, получаем -1/2. Округляем это число в меньшую сторону, получаем -1 т.к. 0 > -1
Очень познавательно! Такая подача материала... конечно дорогого стоит. Спасибо.
P. S. Хотелось бы еще и списка рекомендуемых книг дождаться. 🙂(с грамотным погружением в алгоритмы).
Всё, что идёт после 16:05, я больше ни в одном видео или книге не встречал. Как будто глаза открылись на такие вещи
Мне 14 лет и я хочу досконально изучить все, что связано с компьютерами, операционными системами и айти в целом. Чувак, ты отлично помогаешь, спасибо!
Я тоже. Уже научился питону, c++.
А я уже выучит python, HTML, CSS, Java
А я выучил Java и C++ в 12лет 👍
@@javaproger какой умничка, выучить синтаксис языка это же так сложно))
@@marin232и все же он ещё ребенок, вспомни свои 12 лет😢
супер круто ) еще бы веб теорию ))
Графика и подача огонь🎉
До этого видео вообще не понимал, зачем нужны битовые операции, но после просмотра будто прозрел. Спасибо за качественный контент
Спасибо, это было круто. С одной стороны звучит все просто, а с другой для непривыкшего к двоичной системе исчисления и к Си мозга - пар из ушей. Я думаю еще пару раз повторить с интервалом пару дней и уляжется😁. Но звучит круто, подача непринужденная.
Огонь 🔥
Не глядя лайк.
Спасибо!
Благодарю 🙂
Вы все безумней и безумней)) крутой ролик.
Очень интересно, спасибо за такой подробный материал. В методе getRow округление вниз делать не нужно, т.к. вы говорили что это свойство побитового сдвига, округлять в меньшую сторону если результат не целое число.
Благодарю за подробный и интересный рассказ.
*Л. а. й. к.*
и
*Р. е. с. п. е. к. т.*
Ещё не посмотрел видео, но лайк поставил
лучший!!!
Здравствуйте Alek!
пожалуйста, сделайте видео о том, как работает операционная система
охохо. наконец-то
видосик
Очередной шедевр
это точно, грамотно Автор преподносить информацию
Работал с урдуино на Си, битовыми операторами дёргал порты ввода вывода
Про100 комментарий в поддержку канала. Контент пушка!
БОМБА!"!!!
OMG новый видос
Я всегда стараюсь поддерживать скилы работы с битами. Но, честно, приходится работать с ними очень редко.
Классное, наглядно понятное оформление отлично дополняет текст. Этот коммент поросто дополняет лайк ;-)
Очень грамотно
Доброго времени суток, надеюсь не затрудню вопросом. Будет ли список книжек?) Ведь скоро конец семестра, а значит отдых и саморазвитие наберут максимальные обороты) Отдельная благодарность за видеоролики.
Привет, контент топ , когда будет 2 урок по ассемблеру?
Хотелось бы увидеть ролик про branchless программирование (без ветвления)
ахах) круто, спасибо) Когда на работе сказали рефакторить код, а ты не хочешь больше этим заниматься и пушнув лиду такое, думаю он поймет что дела с тобой плохи)