Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
180 / 178 / 56
Регистрация: 10.06.2011
Сообщений: 871
1

Поразрядные операции - в чем суть и применение?

18.10.2013, 22:18. Просмотров 1876. Ответов 14
Метки нет (Все метки)


Добрый вечер. Объясните, в каких задачах они могут понадобиться и как ими пользоваться. А конкретно &, |, ^, сдвиги и т.д.
*в интернете искал, но мне нужно объяснение знающего человека, у которого если что я могу до спросить
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2013, 22:18
Ответы с готовыми решениями:

Поразрядные операции - в чем суть и применение?
Давно откладывал эту тему, но все же столкнулся с ней снова. Так вот, не могу понять зачем они, где...

Поразрядные операторы - их суть и назначение
Господа, подскажите пожалуйста, что делают поразрядные операторы, если можно, то пожалуйста на...

поразрядные операции
помогите пожалуйста решить следущую задачу: даны два int-числа: N1 = АBCD и N2 = EFGH, где ...

Поразрядные операции
Здравствуйте. Объясните, пожалуйста, есть задача: выполнить поразрядное «или» 0-5 разрядов В и...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
14
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
18.10.2013, 22:25 2
Поразрядные операции - в чем суть и применение?
наша песня хороша начинай сначала? кто не учится на своих ошибках вопросах и наступает на теже грабли и задает их снова?
0
180 / 178 / 56
Регистрация: 10.06.2011
Сообщений: 871
18.10.2013, 22:30  [ТС] 3
Jupiter, вопрос остался открытым
0
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
18.10.2013, 22:41 4
Ryuk, ну так и подымай ту тему. От того что ты задаешь такие вопросы яснее не станет.
В основном & используется для того что бы узнать значение бита или группы бит, | - для того чтобы установить значение бита или группы бит. Сдвиги используют как умножение на два в степени
x << y = x * 2^y
или деление
x >> y = x / 2^y
так же используют для болучения байта(группы байт) из числа (например из одного uitn32_t сделать два uint16_t),
и наоборот для группировки байт(группы байт) в число (например из 4-х байт сделать один int).
И не надо спрашивать для чего это может понадобится.
0
Модератор
Эксперт по электронике
8369 / 6214 / 835
Регистрация: 14.02.2011
Сообщений: 21,582
18.10.2013, 22:53 5
Ryuk,
по моему у тебя проблемы с двоичкой, ты думаешь что это какая то экзотика
Но внутри машины все данные лежат в двоичном коде, а на экран выводятся уже в виде буковок, рисунков, чисел
вот например как можно( для латинского алфавита)
сделать маленькие буквы из больших
C++
1
ch=ch|0x20;
большие из маленьких
C++
1
ch=ch&~0x20;
или поменять большие на маленькие и наоборот
C++
1
ch=ch^0x20;
Выглядит как шаманство, но если откроешь таблицу ASCII кодов то увидишь что отличаются они одним 6 битом(0x20)
http://ru.wikipedia.org/wiki/ASCII
1
180 / 178 / 56
Регистрация: 10.06.2011
Сообщений: 871
18.10.2013, 22:57  [ТС] 6
Цитата Сообщение от Jupiter Посмотреть сообщение
И не надо спрашивать для чего это может понадобится.
Поставим вопрос по другому, зачем поразрядные операторы, если я могу сравнивать десятичные числа с помощью логических операторов?
0
Модератор
Эксперт по электронике
8369 / 6214 / 835
Регистрация: 14.02.2011
Сообщений: 21,582
18.10.2013, 23:01 7
Цитата Сообщение от Ryuk Посмотреть сообщение
зачем поразрядные операторы, если я могу сравнивать десятичные числа с помощью логических операторов?
нет у машины десятичных чисел

если считаешь что они тебе не нужны, то не учи
если тебе достаточно такого уровня абстракции, то пожалуйста
только забудь про эффективный код
0
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
18.10.2013, 23:04 8
Цитата Сообщение от Ryuk Посмотреть сообщение
Поставим вопрос по другому, зачем поразрядные операторы, если я могу сравнивать десятичные числа с помощью логических операторов?
ну сравни, а поменять значение с помощью логических операторов тоже сможешь?
0
Модератор
Эксперт по электронике
8369 / 6214 / 835
Регистрация: 14.02.2011
Сообщений: 21,582
18.10.2013, 23:08 9
да вспомнил
есть такое понятие как флаги, очень часто используют в аргументах функций
C++
1
flag1|flag2
как ты это напишешь арифметически?
0
180 / 178 / 56
Регистрация: 10.06.2011
Сообщений: 871
18.10.2013, 23:25  [ТС] 10
ValeryS, до этого, был хороший пример, только не понял как из ASCII достать шестнадцатеричные числа.
Грубо говоря, с помощью поразрядных операций мы можем проделать нашу программу в еще более мелких деталях?
0
Модератор
Эксперт по электронике
8369 / 6214 / 835
Регистрация: 14.02.2011
Сообщений: 21,582
18.10.2013, 23:31 11
Цитата Сообщение от Ryuk Посмотреть сообщение
ValeryS, до этого, был хороший пример, только не понял как из ASCII достать шестнадцатеричные числа.
элементарно
C++
1
2
for(char ch='A';ch<='Z';ch++)
   printf("%c %d %x \n",ch,ch,ch);
выведет на экран символы от A до Z
их символьное десятичное и шеснадцетеричное значение
1
Супер-модератор
5539 / 2568 / 1294
Регистрация: 04.03.2013
Сообщений: 5,541
Записей в блоге: 1
18.10.2013, 23:48 12
Цитата Сообщение от Ryuk Посмотреть сообщение
Добрый вечер. Объясните, в каких задачах они могут понадобиться и как ими пользоваться. А конкретно &, |, ^, сдвиги и т.д.
Поразрядные операции очень часто нужны, для анализа числа в рамках рассмотрения его в двоичном коде. Например, часто при работе с оборудованием, возникает необходимость считать байт с какого нибудь порта, а потом посмотреть скажем 5-ый бит этого числа. если он скажем равен 1, то это означает, что контроллер готов к дальнейшим действиям). для того чтобы это сделать помогает операция &:
C++
1
2
3
... a = 01011100 (в  двоичном представлении); ....
/*найдем значение 5 бита*/
if (a & 32 /*10000*/ = 1) {....}
Есть еще масса применений...

Добавлено через 2 минуты
То есть мы умножаем нашь байт XXXXXXXX на 00010000 и на выходе получим от умножения 000X0000, таким образом узнаем X.

Добавлено через 7 минут
Язык Си - низкоуровневый (из высокоуровневых) язык. Использование, указателей, а как следствие прямой доступ к адресному пространству, позволяет видеть картину в "единицах и нулях". Очень детально. А чтобы интерпретировать многие данные, приходится применять вот такую, поразрядную, логику, о которой вы задали вопрос...

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
наша песня хороша начинай сначала? кто не учится на своих ошибках вопросах и наступает на теже грабли и задает их снова?
на самом деле поразрядная логика всегда много вопросов вызывает типа "а нафига это вообще нада!!!". всё потому, что Си не учат люди, а учат С++ сразу, а то и C# или Java.

Добавлено через 4 минуты
Цитата Сообщение от Ryuk Посмотреть сообщение
в каких задачах они могут понадобиться
Да в любых, но главное запомнить то, что где они появляются и применяются, там надо взглянуть на число с точки зрения компа, расписать его в двоичной системе счисления. и тогда многое встает на свои места...=)
1
Модератор
Эксперт по электронике
8369 / 6214 / 835
Регистрация: 14.02.2011
Сообщений: 21,582
19.10.2013, 00:09 13
Цитата Сообщение от ildwine Посмотреть сообщение
if (a & 32 /*10000*/ = 1)
даже если это описка = вместо == то все равно не сработает
32 никогда не равно 1
или так
C++
1
if (a & 32 /*10000*/ ==32)
или так
C++
1
if (a & 32 /*10000*/ )
здесь мы закладываемся на то что очистили все биты(=0), кроме пятого, то если 5 бит равен 0 то все число равно 0 т.е ЛОЖЬ
а если равен 1 то число равно 32, не 0 т.е ИСТИНА
0
Супер-модератор
5539 / 2568 / 1294
Регистрация: 04.03.2013
Сообщений: 5,541
Записей в блоге: 1
19.10.2013, 00:20 14
Цитата Сообщение от ValeryS Посмотреть сообщение
даже если это описка = вместо == то все равно не сработает
32 никогда не равно 1
согласен

Добавлено через 2 минуты
C++
1
2
3
... a = 01011100 (в  двоичном представлении); ....
/*найдем значение 5 бита*/
if (a & 32 /*10000*/ ==32) {....}
Добавлено через 34 секунды
ну стремный пример, конечно, но что то на ум ничего лучше не идет. пятница.
0
Модератор
Эксперт по электронике
8369 / 6214 / 835
Регистрация: 14.02.2011
Сообщений: 21,582
19.10.2013, 09:55 15
Ryuk,
вот тебе функция которая печатает двоичное представление числа
C++
1
2
3
4
5
6
void DecToBin(unsigned int n)
{
 for(int i=sizeof(unsigned int)*8-1;i>=0;i--)
     printf("%c",n&(1<<i)?'1':'0');
 printf("\n");
}
выделяет каждый бит начиная со старшего и печатает его
можно было бы и сделать без поразрядных операций но не так красиво получится
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2013, 09:55

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Поразрядные операции
Есть 16-е число, например N=0xC5D612F7, помогите убрать единицу в старшем бите у C и F, используя...

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

Поразрядные операции
Даны два int-числа: N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры. Образовать long-число...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.