|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
16.06.2010, 20:32 | #1 |
Пользователь
Регистрация: 07.06.2010
Сообщений: 10
|
Деление байта пополам
Как из переменной типа byte(она же char) получить старшие 4 и младшие 4 разряда?
|
16.06.2010, 21:29 | #2 |
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
младшие
foo & 0xf старшие foo >> 4 & 0xf |
16.06.2010, 21:54 | #3 |
Пользователь
Регистрация: 07.06.2010
Сообщений: 10
|
Брр, видимо я совсем ничерта не понимаю в программировании.
Можно чуть подробнее? Допустим, byte a - переменная из которой надо получить значения. В b(кстати, какого они будут типа, тоже byte?) записать старшую половину, в с - младшую... Последний раз редактировалось necroant; 16.06.2010 в 22:00. |
16.06.2010, 22:01 | #4 |
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
Нет byte - есть char. Какого типа b - ну, любого, чтобы число можно было к нему привести.
Не знаю, куда подробнее... Код:
|
16.06.2010, 22:59 | #5 |
Пользователь
Регистрация: 07.06.2010
Сообщений: 10
|
Всё-всё. Теперь понял, спасибо большое. Уфф, ну не программист я, не программист... Надо было на медецинский поступать.
А насчет byte - в билдере есть rpchdr.h, а в нем есть typedef unsigned char byte. И чсх, если переменная типа char - в RichEdit выводятся символы, а если byte - десятичные числа от 0 до 255. |
16.06.2010, 23:04 | #6 |
Форумчанин
Регистрация: 26.04.2010
Сообщений: 328
|
вы таки уверены, что char занимает байт ? Я б на вашем месте никогда не делал бы таких предположений, не правильно это
|
16.06.2010, 23:43 | #7 |
Пользователь
Регистрация: 07.06.2010
Сообщений: 10
|
Нет, серьезно? Все источники какие мне попадались утверждают что таки да, ровно байт...
|
16.06.2010, 23:51 | #8 |
Форумчанин
Регистрация: 08.01.2010
Сообщений: 165
|
Для ozo:
Лично мне не известно ни одной реализации компилятора языка C или C++, в котором char занимает больше одного байта. Так что такое предположение сделать можно. Более того, приведённые строки будут работать, в принципе, даже в том случае, если char имеет размер более одного байта. Для necroant: Этот форум - про общие вопросы C/C++, а билдер - разговор отдельный) Что уж там намучено в заголовочных файлах - проблема билдера, и ничья больше. Поэтому не советую отвлекаться на билдеровский byte - в C/C++ такого типа нет и баста) Есть char. А теперь пара объяснений о том, как работает написанный выше код: Представим, что в a у нас хранится число 150. В шестнадцатеричной записи это 0x96, а в двоичной - 10010110. Код:
По сути, побитовые операции аналогичны операциям логическим (наверное, вам случалось иметь дело с && или с || в сложных условиях в операторе if), но логическая операция применяется к каждому биту числа. В данном случае работает это так: число a - это 10010110 0xf - это 00001111 (кстати, такие вот числа называются числами-масками) теперь нам нужен результат применения & к каждому биту у обоих чисел 10010110 00001111 ------------- 00000110 как мы видем, мы по сути "погасили" все те биты исходного числа, на месте которых в маске стоял 0 и оставили теми же те биты, где стояло 1. А как же работает этот код? Код:
Эта операция сдвигает число в двоичной записи вправо на указанное количество бит. То есть имеем мы число 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 и т. д. Чтобы остеречься от этого, нужно на всякий случай сбросить старшие (правые) четыре бита, применив маску. А как это сделать мы уже поняли на первом шаге. Вот и получился у нас полный код Код:
|
16.06.2010, 23:53 | #9 |
Участник клуба Подтвердите свой е-майл
Регистрация: 19.11.2007
Сообщений: 1,022
|
Все правильно. Char занимает 1 байт. Просто ozo не сказал, что есть такая штука как unicode где char занимает больше 1 байта и таким образом можно кодировать практически любую письменность.
|
16.06.2010, 23:59 | #10 | |
Форумчанин
Регистрация: 08.01.2010
Сообщений: 165
|
Цитата:
А char - один байт. Хотя чисто теоретически, в некоторой чрезвычайно экзотической реализации C/C++ оно может занимать и больше... но зачем?) Да и нет таких реализаций. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сегмент байта (Паскаль) | 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 |