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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 16.06.2010, 20:32   #1
necroant
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 10
По умолчанию Деление байта пополам

Как из переменной типа byte(она же char) получить старшие 4 и младшие 4 разряда?
necroant вне форума
Старый 16.06.2010, 21:29   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

младшие
foo & 0xf
старшие
foo >> 4 & 0xf
Somebody вне форума
Старый 16.06.2010, 21:54   #3
necroant
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 10
По умолчанию

Брр, видимо я совсем ничерта не понимаю в программировании.
Можно чуть подробнее? Допустим, byte a - переменная из которой надо получить значения. В b(кстати, какого они будут типа, тоже byte?) записать старшую половину, в с - младшую...

Последний раз редактировалось necroant; 16.06.2010 в 22:00.
necroant вне форума
Старый 16.06.2010, 22:01   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Нет byte - есть char. Какого типа b - ну, любого, чтобы число можно было к нему привести.
Не знаю, куда подробнее...
Код:
char c = a & 0xf, b = a >> 4 & 0xf;
Somebody вне форума
Старый 16.06.2010, 22:59   #5
necroant
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 10
По умолчанию

Всё-всё. Теперь понял, спасибо большое. Уфф, ну не программист я, не программист... Надо было на медецинский поступать.
А насчет byte - в билдере есть rpchdr.h, а в нем есть typedef unsigned char byte. И чсх, если переменная типа char - в RichEdit выводятся символы, а если byte - десятичные числа от 0 до 255.
necroant вне форума
Старый 16.06.2010, 23:04   #6
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

вы таки уверены, что char занимает байт ? Я б на вашем месте никогда не делал бы таких предположений, не правильно это
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума
Старый 16.06.2010, 23:43   #7
necroant
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 10
По умолчанию

Нет, серьезно? Все источники какие мне попадались утверждают что таки да, ровно байт...
necroant вне форума
Старый 16.06.2010, 23:51   #8
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Для ozo:

Лично мне не известно ни одной реализации компилятора языка C или C++, в котором char занимает больше одного байта.

Так что такое предположение сделать можно.

Более того, приведённые строки будут работать, в принципе, даже в том случае, если char имеет размер более одного байта.

Для necroant:
Этот форум - про общие вопросы C/C++, а билдер - разговор отдельный) Что уж там намучено в заголовочных файлах - проблема билдера, и ничья больше. Поэтому не советую отвлекаться на билдеровский byte - в C/C++ такого типа нет и баста) Есть char.

А теперь пара объяснений о том, как работает написанный выше код:

Представим, что в a у нас хранится число 150. В шестнадцатеричной записи это 0x96, а в двоичной - 10010110.

Код:
char c = a & 0xf
Здесь к переменной a применяется побитовая операция & (Побитовое И).
По сути, побитовые операции аналогичны операциям логическим (наверное, вам случалось иметь дело с && или с || в сложных условиях в операторе if), но логическая операция применяется к каждому биту числа.

В данном случае работает это так:

число a - это 10010110
0xf - это 00001111 (кстати, такие вот числа называются числами-масками)
теперь нам нужен результат применения & к каждому биту у обоих чисел
10010110
00001111
-------------
00000110

как мы видем, мы по сути "погасили" все те биты исходного числа, на месте которых в маске стоял 0 и оставили теми же те биты, где стояло 1.

А как же работает этот код?

Код:
b = a >> 4 & 0xf;
Сначала производится операция побитового сдвига вправо (>>).

Эта операция сдвигает число в двоичной записи вправо на указанное количество бит. То есть имеем мы число a, которое равно 150 в десятичной или же 10010110 в двоичной записях.
a - 10010110
Если мы сделаем a >> 1, то получим 01001011 (все биты сдвинулись влево на одну позицию).
А если сделаем a >> 2, то получим 00100101 (а здесь уже на две).

Собственно говоря, что нам нужно, чтобы получить четыре старших (самых правых при записи) бита? Достаточно сдвинуть число на четыре бита вправо, что здесь и делается:

b = a >> 4;

Вообще-то, если переменный наши имеют тип unsigned char (что является самым уместным, если нам нужны операции с битами и прочией плюшки без гемороя), то этого достаточно. Но если мы имеем дело с signed char, и если a - отрицательное число, то при сдвиге пустоты слева будут заполняться не ноликами, а единичками. То есть:
a - 10010110
a >> 1 == 11001011
a >> 2 == 11100101 и т. д.

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

Код:
b = a >> 4 & 0xf;
kogemrka вне форума
Старый 16.06.2010, 23:53   #9
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Все правильно. Char занимает 1 байт. Просто ozo не сказал, что есть такая штука как unicode где char занимает больше 1 байта и таким образом можно кодировать практически любую письменность.
profi вне форума
Старый 16.06.2010, 23:59   #10
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Все правильно. Char занимает 1 байт. Просто ozo не сказал, что есть такая штука как unicode где char занимает больше 1 байта и таким образом можно кодировать практически любую письменность.
Ничего подобного. Если мы имеем дело с unicode, мы используем w_char (так называемые wide char). Сколько он занимает - зависит от системы. В windows, если пишем unicode-приложение вроде как два байта. В Linux (во всяком случае в 64-битных версиях) - вроде как четыре. Короче говоря, наверняка и не скажешь.

А char - один байт.
Хотя чисто теоретически, в некоторой чрезвычайно экзотической реализации C/C++ оно может занимать и больше... но зачем?) Да и нет таких реализаций.
kogemrka вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сегмент байта (Паскаль) Dizistar Помощь студентам 9 24.04.2010 22:54
Сколько раз можно свернуть лист бумаги пополам Altera Свободное общение 21 17.01.2010 11:37
Метод деления отрезка пополам Delphi lordve Помощь студентам 0 06.12.2009 23:57
поиск корня методом деления пополам jewels Общие вопросы C/C++ 2 16.11.2009 01:09
Вычисление корня уравнения методом деления отрезка пополам Absent Помощь студентам 12 25.11.2007 17:54