Помощь - Поиск - Пользователи - Календарь
Полная версия: Замена цифр в 16-чном представлении
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
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; // Ну, и не забывать сдвигать эту маску тоже...

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