Учитывая только 4 бита за раз при преобразовании десятичного числа в шестнадцатеричное

|1 2 3|
|4 5 6| 

Используйте следующий код для печати значений.

System.out.println(Arrays.deepToString());

Выход будет выглядеть так (вся матрица в одной строке):

[[1,2,3],[4,5,6]]
-2
задан d827 5 March 2019 в 18:10
поделиться

3 ответа

Это зависит от вашей системы, но если вы хотите извлечь nybbles из вашего значения, вы можете в конечном итоге применить 0xF (маски >> (4 * n)) к вашим значениям. Например, если я получил двоичные данные, выглядящие следующим образом [110 ] и мне нужно извлечь только первую часть этой, которую я мог бы использовать 0xF000 = 1111 0000 0000 0000 с & amp; замаскируйте это 0x4602, чтобы получить первую часть этого значения. Это даст нам 0xF000 = 1111 0000 0000 0000 &0x4602 = 0100 0110 0000 0010 result would be 0x4000 = 0100 0000 0000 0000

, чтобы получить n-ую часть этого значения, которое вы могли бы сместить (0xF000) с >> 4 n раз

.
0
ответ дан fratardi 5 March 2019 в 18:10
поделиться

Вам нужно запустить цикл от 0-7, а также переместить число после применения маски, чтобы опустить клев.

for(int i = 0; i < 8; i++){
    int temp = (mask & num) >> (28 -4*i);
0
ответ дан Ajay P 5 March 2019 в 18:10
поделиться

Первое замечание, касающееся вашего кода без учета проблемы, заключается в том, почему вы хорошо справляетесь с делом 0..9, но отделяете дела A и B ... и F вместо того, чтобы делать то же самое, что вы делаете для цифра?

так

int hexConversion(int num){
  char hex_buffer[9];
  unsigned int mask = 4026531840;
  for(int i = 0; i < 9; i++){
    int temp = mask & num;
    if(temp < 10){
      hex_buffer[i] = temp + '0';
    }
    else if (temp < 16) {
      hex_buffer[i] = temp - 10 + 'A';
    }
    else {
      hex_buffer[i] = '?';
    }
    mask >>= 4;
  }

  hex_buffer[8] = '\0';

  for(int i = 0; i < sizeof(hex_buffer); i++){
    printf("%c", hex_buffer[i]);
  }
}

Я добавил тест if (temp < 16), обычно бесполезный, если код правильный, но результат:

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra h.c
h.c: In function ‘hexConversion’:
h.c:23:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < sizeof(hex_buffer); i++){
                      ^
pi@raspberrypi:/tmp $ ./a.out
00000002000000?F0??????F???????F000000000??????F

, поэтому в вашем решении вы не пишете по некоторым индексам из-за ошибки в вашем коде

Один из способов сделать это:

void hexConversion(int num){
  char hex_buffer[9];

  for(size_t i = 0; i < sizeof(hex_buffer) -1; i++){
    int temp = (num >> (28-4*i)) & 0xf;
    if(temp < 10){
      hex_buffer[i] = temp + '0';
    }
    else {
      hex_buffer[i] = temp - 10 + 'A';
    }
  }
  hex_buffer[8] = 0;
  puts(hex_buffer);
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra h.c
pi@raspberrypi:/tmp $ ./a.out
00000002
000000FF
FFFFFFFF
7FFFFFFF
80000000
DEADBEEF

Обратите внимание, что ваш код предполагает, что int на 32b не зависит от размера (но предположим, что char на 8 битах): [1115 ]

void hexConversion(int num){
  char hex_buffer[sizeof(int)*2 + 1];

  for(size_t i = 0; i < sizeof(int)*2; i++){
    int temp = (num >> (sizeof(int)*8-4-4*i)) & 0xf;

    if(temp < 10){
      hex_buffer[i] = temp + '0';
    }
    else {
      hex_buffer[i] = temp - 10 + 'A';
    }
  }
  hex_buffer[sizeof(int)*2] = 0;
  puts(hex_buffer);
}
0
ответ дан bruno 5 March 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: