Преобразование шестнадцатеричного числа со знаком любой длины в десятичное со знаком (excel)

Вопрос

Столкнувшись со знаковыми шестнадцатеричными числами неизвестной длины, как можно использовать формулы Excel, чтобы легко преобразовать эти шестнадцатеричные числа в десятичные числа?

Пример

Hex
---
00
FF
FE
FD
0A
0B
2
0
7 404
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте этот глубоко вложенный формула:

=HEX2DEC(N)-IF(ISERR(FIND(LEFT(IF(ISEVEN(LEN(N)),N,CONCAT(0,N))),"01234567")),16^LEN(IF(ISEVEN(LEN(N)),N,CONCAT(0,N))),0)

где N - ячейка, содержащая шестнадцатеричные данные.

Эта формула становится более читаемой при раскрытии:

=HEX2DEC(N) -
 /* check if sign bit is present in leftmost nibble, padding to an even number of digits if necessary */
 IF( ISERR( FIND( LEFT( IF( ISEVEN(LEN(N))
                          , N
                          , CONCAT(0,N)
                          )
                      )
                , "01234567"
                )
          )
   /* offset if sign bit is present */
   , 16^LEN( IF( ISEVEN(LEN(N))
               , N
               , CONCAT(0,N)
               )
            )
   /* do not offset if sign bit is absent */
   , 0
   )

и может читаться как «Сначала преобразуйте шестнадцатеричное значение в беззнаковое десятичное. Затем сместите беззнаковое десятичное значение, если крайний левый полубайт данных содержит знаковый бит; в противном случае не смещайте».

Пример преобразования

Hex  | Dec
-----|----
00   |   0
FF   |  -1
FE   |  -2
FD   |  -3
0A   |  10
0B   |  11

@ Gary'sStudent, вы можете оценить это расширение к исходному ответу. Исходная формула не обрабатывала данные с нечетным количеством полубайтов, тогда как эта формула обрабатывает данные.

Eric Schnipke 25.10.2018 22:46

Пусть ячейка A1 содержит 1-байтовую шестнадцатеричную строку любого регистра.

Чтобы получить двоичное десятичное значение этой строки, используйте следующее:

=HEX2DEC(A1)-IF(HEX2DEC(A1) > 127, 256, 0)

Для произвольной длины байтов используйте следующее:

=HEX2DEC(A1) - IF(HEX2DEC(A1) > POWER(2, 4*LEN(A1))/2 - 1, POWER(2, 4*LEN(A1)), 0)

Я ценю ваш ответ @Daniel - я подозреваю, что это будет хорошо работать для 8-битных целых чисел со знаком, но не сработает для более широких битов типа данных.

Eric Schnipke 03.12.2020 22:04

Ой, извините, все ваши примеры были для 1-байтовых чисел, я добавлю к своему ответу общий случай.

Daniel 03.12.2020 22:15

Я не использовал здесь какие-либо формулы, но этот ответ имеет смысл и его легко запомнить. Поэтому я бы предпочел его первому ответу @EricSchnipke, который выглядит менее интуитивно понятным.

Janis 12.02.2021 13:49

Другие вопросы по теме