Помощь - Поиск - Пользователи - Календарь
Полная версия: Замена цифр в 16-чном представлении
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
18192123
Нужно заменить в 16-ричном представлении числа 5-ку на f.
объясните пожалуйста, в чём у меня ошибка здесь?

#include <stdio.h>
#include <stdlib.h>
int main() {
char str[60];
unsigned x,mask,mask1;
printf ("Vvedite cheloe neotrichatel'noe 4islo\n");
scanf("%d", &x);
printf("V 16-oi sisteme: %x\n\n",x);
itoa(x, str, 2);
printf("vvedennoe chislo v 2-i sisteme schislenia: %s\n", str);
mask = 0x5;
mask1= 0xf;


while (mask>0)
{
if ((mask&x) == mask)
x=x|mask1;

mask<<=4;

}

printf("\nPreobrazovannoe chislo v 16-i sisteme chislenia: %x\n",x);
return 0;

}

volvo
А вот тут происходит то, о чем я писал тебе раньше... Смотри, допустим, есть число: 0x2575

Первое сравнение отработает прекрасно: последняя цифра числа = 0x5, маска тоже 0x5, никаких проблем, последняя цифра меняется на 0xf...

Дальше - проблема: маска mask = 0x50 после сдвига, вторая цифра (вместе с первой) = 0x70, делаем AND - что будет?

01010000
and
01110000
=
01010000
, т.е. произведение равно маске, ХОТЯ цифра-то другая...

Чтобы отработало правильно, здесь применяется другой способ:
  while (mask>0) {

if((~(x&mask1)^(~mask)) == 0)
x = x | mask1;

mask <<= 4;
mask1 <<= 4; // Ну, и не забывать сдвигать эту маску тоже...

}
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.