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