Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
IIIa66uMEM6eP
заставил Бендера
843 / 309 / 16
Регистрация: 05.12.2010
Сообщений: 1,662
Записей в блоге: 6
#1

Побитовые операции, работа с шестнадцатеричной записью

27.03.2011, 21:21. Просмотров 3185. Ответов 26
Метки нет (Все метки)

Добрый вечер. Цель лабы обработка числовой информации, работа с побитовыми операциями.
Сама задача: Дано длинное целое неотрицательное число. Заменить каждую цифру F в шестнадцатеричной записи этого числа цифрой 7.
Что прошу: собственно помощь в выполнении, алгоритм или кусок кода - кто чем поможет.
PS: функции использовать нельзя..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2011, 21:21
Ответы с готовыми решениями:

работа с записью числа в шестнадцатеричной сс
Доброго времени суток. Помогите, пожалуйста, с лабораторкой. На ввод даётся...

Определить, является ли текст шестнадцатеричной записью числа, кратного 5 (Pascal -> C++)
Помогите пожалуйста перевести из Pascal в С++ Задан текст, в который входят...

Побитовые операции
Задание: Дано целое неотрицательное число. Определить количество составляющих...

Побитовые операции
Задача: битовый образ 8*8 задается при помощи 8 байт, каждый байт состоит,...

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

26
odip
Эксперт С++
7161 / 3220 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
28.03.2011, 09:24 #2
C
1
2
3
4
5
unsigned int num= 0x.....;
 
if ( (num&0x0000000F) == 0x0000000F ) { num&= 0xFFFFFFF7; }
 
/* остальные 7 проверок сам напиши */
1
IIIa66uMEM6eP
заставил Бендера
843 / 309 / 16
Регистрация: 05.12.2010
Сообщений: 1,662
Записей в блоге: 6
28.03.2011, 21:23  [ТС] #3
odip, человек вводит число в десятичном представлении.. в этом проблема.
И как
C++
1
(num&0x0000000F) == 0x0000000F
Прокомментируйте пожалуйста алгоритм, не понял..

Добавлено через 10 часов 44 минуты
какие 7 проверок?
0
eXXXXXXXXXXX
30 / 30 / 6
Регистрация: 24.02.2011
Сообщений: 126
28.03.2011, 21:46 #4
ну, возможно, следует в цикле переводить в 16-ю систему счисления, и параллельно строить выходное число, заменяя F на 7
а с побитовыми операциями, начинать с мл. разряда и рассматривать по 4 бита, если они совпадают с 1111 то менять на 0111
0
IIIa66uMEM6eP
заставил Бендера
843 / 309 / 16
Регистрация: 05.12.2010
Сообщений: 1,662
Записей в блоге: 6
28.03.2011, 22:20  [ТС] #5
Цитата Сообщение от eXXXXXXXXXXX Посмотреть сообщение
с 1111 то менять на 0111
вы сейчас предложили мне заменить десятичную на 16 а результат сравнивать в двоичной..
0
Evg
Эксперт CАвтор FAQ
19278 / 7135 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
28.03.2011, 22:24 #6
Какая в пень разница, в каком представлении вводят число. В машине оно всегда хранится в двоичном виде и все операции над числами машина проводит в двоичном представлении

По поводу представления чисел почитай Неочевидные ответы на простые вопросы раздел 8, может ясность какая появится
0
IIIa66uMEM6eP
заставил Бендера
843 / 309 / 16
Регистрация: 05.12.2010
Сообщений: 1,662
Записей в блоге: 6
28.03.2011, 22:27  [ТС] #7
Цитата Сообщение от Evg Посмотреть сообщение
может ясность какая появится
вы мне это уже писали)
проблема что в данном контексте задачи - все же мы вводим в одной сс а работаем над ней в другой.
0
eXXXXXXXXXXX
30 / 30 / 6
Регистрация: 24.02.2011
Сообщений: 126
28.03.2011, 22:33 #8
например, число 241(F1 в 16-ой) хранится в виде посл-ти битов 11110001. Вы можете применять побитовые операции к этому числу, и получать необходимое
0
Evg
Эксперт CАвтор FAQ
19278 / 7135 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
28.03.2011, 22:58 #9
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
проблема что в данном контексте задачи - все же мы вводим в одной сс а работаем над ней в другой
Неправильно. Ты можешь ввести "17", предполлагая десятичную запись. Можешь ввести "11", предполагая 16-ричную запись. Но в обоих случаях ты введёшь одну и ту же величину и в памяти машина она будет храниться в виде "10001" (в двоичном виде). Ты можешь написать

C
1
2
3
4
int x, y, z;
x = 17;
y = 7;
z = x & y;
или

C
1
2
3
4
int x, y, z;
x = 0x11;
y = 0x7;
z = x & y;
на результат это никоим боком не повлияет
0
easybudda
Модератор
Эксперт CЭксперт С++
10054 / 5974 / 1493
Регистрация: 25.07.2009
Сообщений: 11,313
28.03.2011, 23:15 #10
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
    
int main(void){
    int n;
    
    while ( printf("Number: ") && scanf("%i", &n) == 1 )
        printf("Before: %#x\nAfter:  %#x\n", n, n & ~0x88888888);
    
    return 0;
}
1
Evg
Эксперт CАвтор FAQ
19278 / 7135 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
28.03.2011, 23:27 #11
easybudda, а "~0x88888888" вместо "0x77777777" - это чтобы враги не догадались?
0
easybudda
Модератор
Эксперт CЭксперт С++
10054 / 5974 / 1493
Регистрация: 25.07.2009
Сообщений: 11,313
28.03.2011, 23:32 #12
Evg, ага... мне так нагляднее показалось. семь - это пятнадцать без восьми...
0
IIIa66uMEM6eP
заставил Бендера
843 / 309 / 16
Регистрация: 05.12.2010
Сообщений: 1,662
Записей в блоге: 6
29.03.2011, 01:30  [ТС] #13
Цитата Сообщение от easybudda Посмотреть сообщение
мне так нагляднее показалось
я с вашего кода дурею)) точно как для врагов - ни че не понятно)
подскажите как это будет выглядеть на с++
ну или хотяб пару комментариев
0
easybudda
Модератор
Эксперт CЭксперт С++
10054 / 5974 / 1493
Регистрация: 25.07.2009
Сообщений: 11,313
29.03.2011, 01:38 #14
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
ну или хотяб пару комментариев
Это на одну-то строчку? На самом деле даже и не знаю, что там комментировать... Вроде бы
Цитата Сообщение от easybudda Посмотреть сообщение
семь - это пятнадцать без восьми.
всё сказано... Суть - нужно обнулить каждый четвёртый бит.
0
IIIa66uMEM6eP
заставил Бендера
843 / 309 / 16
Регистрация: 05.12.2010
Сообщений: 1,662
Записей в блоге: 6
29.03.2011, 01:40  [ТС] #15
Цитата Сообщение от easybudda Посмотреть сообщение
что там комментировать
я не понимаю кода "с" ..
мне не понятно что делают ("%i", &n) == 1 )
мне не понятно что это - %#x\nAfter: %#x\n", n,

какие то запятые.. хоть бери и синтаксис си учи..
0
easybudda
Модератор
Эксперт CЭксперт С++
10054 / 5974 / 1493
Регистрация: 25.07.2009
Сообщений: 11,313
29.03.2011, 01:52 #16
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
я не понимаю кода "с"
да ёпэрэсэтэ
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>
 
int main(){
    int n;
    
    while ( std::cout << "Number: " && std::cin >> n )
        std::cout << "Before: " << std::hex << n << "\nAfter:  " << std::hex << ( n & 0x77777777 ) << std::endl;
    
    return 0;
}
одна беда - код неправильный, некоторые числа по ошибке корёжит...
1
IIIa66uMEM6eP
заставил Бендера
843 / 309 / 16
Регистрация: 05.12.2010
Сообщений: 1,662
Записей в блоге: 6
29.03.2011, 02:00  [ТС] #17
Цитата Сообщение от easybudda Посмотреть сообщение
некоторые числа по ошибке корёжит
дайте пример, если не сложно... надо думать как поправить
0
ValeryS
Модератор
7215 / 5478 / 682
Регистрация: 14.02.2011
Сообщений: 18,530
29.03.2011, 02:26 #18
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
Цель лабы
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
я не понимаю кода "с"
как же до лаб то допустили
0
odip
Эксперт С++
7161 / 3220 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
29.03.2011, 11:10 #19
odip, человек вводит число в десятичном представлении.. в этом проблема.
Это проблема существует только в твоей голове
Нет никакой разницы в какой системе вводить число
Число - оно вообще не зависит от системы счисления !

Добавлено через 4 минуты
easybudda в обоих примерах неправильно решил задачу
Задача состоит в том что если цифра F, то заменить ее на 7
А приведенный код например заменяет цифры 8 на 0

какие 7 проверок?
считаем что unsigned int занимает 4 байта
Итого в числе будет 8 16-ричных цифр
Значит нужно 8 повторить код замены, который я написал в посте #2
1
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
29.03.2011, 14:10 #20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream.h>
 
int main(int argc, char* argv[])
{
   int number, mask;
 
   cin >> number;
   for (int i = 0; i < sizeof(int)*2; i++)
   {
      if (((number>>i*4)&0xf) == 0xf)
      {
         mask = 0x8<<i*4;
         number &= ~mask;
      }
   }
   cout << number << endl;
   system("pause");
   return 0;
}
2
29.03.2011, 14:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2011, 14:10

Побитовые операции
От друга услышал идею о побитовой сортировки имен (например). К примеру, если у...

Побитовые операции
Всем доброго утра. Дана такая задача: есть два чсила,поменять местами 2...

Побитовые операции
Здравствуйте уважаемые читатели форума! СОвсем не представляю как сделать...


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

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

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