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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2014, 00:57   #1
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию Побайтовые операции, зачем они и как их понять?

Здравствуйте.
Изучаю C++ по книге Герберта Шилдта, дошел до ~210 страницы, там идет разговор о побайтовых операциях, которые позволяют работать с битами напрямую.

Но, к сожалению смысл этой главы мне не ясен, я не понимаю что к чему там.
Все что я знаю, это системы счисления, и то формулы преобразования не вспомню.

Вопрос : Насколько нужно это изучать, и как вообще это понять, если в этой области я обладают только поверхностными знаниями в системах счисления.
Или это дело нужно только для написания HEX'о-подобных программ и для побайтового сравнения файлов.

P.S. Вопрос возможно глупый, но крайне важный, как по мне.

P.S.P.S. Также очень интересно почему Шилдт с такой легкостью все объясняет там, будто читатели обязаны уже это знать все, говорит что надо 6 бит обнулить что бы перевести прописную в строчную и др., хотя вот мне сложно немного это осмыслить, но я все-таки понял суть этого "обнуления", понял что 01100110 и 01000110 различаются в 10 степени ровно на 32, а учитывая этот факт и факт разницы на 32 символа между строчными и прописными в ANSI таблицы можно тем самым перевести прописную в строчную.
Но, тем не менее, я не понял особо почему для этого он применил вот такой код : ch = ch & 223; может объясните?

Заранее спасибо за ответ.

Последний раз редактировалось DakotaZ; 19.09.2014 в 01:05.
DakotaZ вне форума Ответить с цитированием
Старый 19.09.2014, 01:30   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

223 в деятичной равно 11011111 в двоичной.
223(10)=11011111(2)
То есть 0 - только в 3-м старшем разряде.
Поэтому побитная операция И с 223 означает, что будет сброшен 3-й старший разряд в 0, а остальные не изменятся.

Кстати, ch = ch & 223 - это простейший способ перевести в регистр больших букв. Если без побитных операций, то сложнее :
" если ch - код моленькой буквы, то вычесть 32, а если нет то не надо ". А с побитыми - проще.

Последний раз редактировалось type_Oleg; 19.09.2014 в 01:54.
type_Oleg вне форума Ответить с цитированием
Старый 19.09.2014, 01:35   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Пойми, для начала, самое главное - вся цифровая информация хранится, обрабатывается и передаётся только в двоичном виде. Это закон природы, а не нечто рукотворное. ДНК в хромосомах всего живого несёт двоичный код! Да-да, именно так! Условный логический 0 - это кирпичик АТ (аденин-тимин, если не ошибаюсь), условная логическая 1 - это пара CG (цитозин-гуанин) (в терминах могу ошибиться, а лезть википедить влом).
Десятичное представление придумали уже человеки, ибо 10 пальцев на руках и всё такое. Разбиение на байты (по 8 бит), слова (16 бит), двойные слова (32 бита) и т.д. тоже придумали позднее для удобства. Да и то не сразу байт стал 8-битным по стандарту, были другие варианты.

Если тебе это сейчас не надо, просто заложи книжку закладкой на 210-й странице. Даю гарантию 100% - если будешь писать программы, то эта закладка тебе пригодится. А пока запомни, что в килобайте не 1000 байт, а 1024. А также, что сдвиг влево на разряд - это умножение на 2, а вправо - деление на 2. В знаковых типах 1 в старшем бите означает знак минус, а остальные - инверсия числа по модулю.

Вопрос правильный, неглупый. Вкуришь сам, на практике.

З.Ы. Диапазон чисел, которые можно показать на пальцах двух рук - это [0...1023].
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 19.09.2014, 02:50   #4
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Даю гарантию 100% - если будешь писать программы, то эта закладка тебе пригодится.
То есть программы без знания битовых операций никак писать нельзя?
Сейчас весь комментарий точно не прочитал, и ответы все не прочитал точно, потому что у меня ночь сейчас.
Но вообще, лично по этой фразе мне кажется ты путаешь написание обычных программ(игры, плееры, трейнеры) от написания программ системного уровня(драйвера и др.).
Просто ты сначала говоришь что это можно отложить пока не понадобится, а потом пишешь что без этого никак.

Последний раз редактировалось DakotaZ; 19.09.2014 в 02:55.
DakotaZ вне форума Ответить с цитированием
Старый 19.09.2014, 03:22   #5
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от DakotaZ Посмотреть сообщение
То есть программы без знания битовых операций никак писать нельзя? ..
А почему так не даются побитовые операции? Ведь если понять двоичную арифметику ( двоичное представление и основные догические операции - И, ИДИ, НЕ), то все просто.
А не поняв двоичной арифметики, я не вижу смысла изучать C++.
Можно конечно без нее обойтись для некоторых программ, даже без знания таблицы умножения можно обойтись.

Или непонятно, зачем нужны побитные?
С ними проще многие задачи решаются. Потому что, как уже написали, в компьютере ВСЯ информация в двоичном коде. То есть, фактически - ничего, кроме бит.
type_Oleg вне форума Ответить с цитированием
Старый 19.09.2014, 03:34   #6
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
А почему так не даются побитовые операции?
Наверное потому что я привык понимать, для чего конкретно что-либо требуется и почему делается именно так, а не как-то еще, дотошность - иными словами.

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Ведь если понять двоичную арифметику
Можно тут подробнее, может статейку подкините, видеоурок или еще чего

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
А не поняв двоичной арифметики, я не вижу смысла изучать C++.
Это утверждение легко оспорить, не ASM же изучаю.

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Или непонятно, зачем нужны побитные?
С ними проще многие задачи решаются.
Примеры в студию)
DakotaZ вне форума Ответить с цитированием
Старый 19.09.2014, 09:35   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Двоичная математика тебе навряд ли понадобиться в повседневном программирование за исключением если ты не пишешь к примеру игры, различные протоколы где особенно часто встречаются двоичные представления.
А так я считаю что каждый программист должен знать булеву математику, уметь быстро преобразовать числа из одной системы в другую ну или хотя бы базовые 2, 8, 10, 16 потому что никогда не знаешь то с чем завтра тебе предстоит столкнутся ну а такие базовые понятия в арсенале всегда должны быть.
coNsept вне форума Ответить с цитированием
Старый 19.09.2014, 09:39   #8
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Например, чтобы понять вот это:
Код:
FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
Вообще, спуск на более низкий уровень - это нормально, только так можно разобраться в высокоуровневых вопросах. Например, сейчас не могу переварить вот этот вопрос в C++ http://en.cppreference.com/w/cpp/atomic/memory_order. Понимаю, что нужны достаточные знания на уровни ассемблера.
220Volt вне форума Ответить с цитированием
Старый 19.09.2014, 09:49   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Например, чтобы понять вот это:
Код:
FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
Вообще, спуск на более низкий уровень - это нормально, только так можно разобраться в высокоуровневых вопросах. Например, сейчас не могу переварить вот этот вопрос в C++ http://en.cppreference.com/w/cpp/atomic/memory_order. Понимаю, что нужны достаточные знания на уровни ассемблера.
Я, балдею. Это не Си, это библиотеки , Путать язык с библиотекам, это удел профанов.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 19.09.2014, 09:52   #10
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Я, балдею. Это не Си, это библиотеки , Путать язык с библиотекам, это удел профанов.
Вы пишите код без библиотек? Можно найти массу примеров с битовыми масками, например, winapi.

Библиотеки существуют как-то отдельно от языка? И я утверждал что это не библиотека?

Последний раз редактировалось 220Volt; 19.09.2014 в 09:55.
220Volt вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив потоков, и как они очищаются Winexcel Общие вопросы Delphi 5 09.10.2013 16:43
Есть программа на c#, получены исходные коды рефлектором, как понять, что они нормальные и помогут доработать программу? kpacaba C# (си шарп) 13 05.05.2012 11:59
Метки в Pascal/delphi. Зачем они? Человек_Борща Общие вопросы по программированию, компьютерный форум 43 13.01.2012 09:21
Что такое коды ASCII и зачем они?? Ларик Помощь студентам 2 27.01.2008 19:41
обновление в блоге - Ресурсы. Зачем они нужны. Pblog Обсуждение статей 0 27.05.2007 03:17