Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Замена цифр в 16-чном представлении

Автор: 18192123 19.05.2007 2:16

Нужно заменить в 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 19.05.2007 2:50

А вот тут происходит то, о чем я писал тебе раньше... Смотри, допустим, есть число: 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; // Ну, и не забывать сдвигать эту маску тоже...

}