Как привести 10-разрядное целое число к 16-разрядному целому в C - PullRequest
0 голосов
/ 07 января 2020

Я анализирую данные, представляющие собой 10-разрядное целое число со знаком. Поскольку единственный способ представить эти данные - использовать int или short (для двухбайтового представления знака), мне нужно привести 10-16 бит. Я уже применил 2 метода, но они либо медленные, либо зависят от компилятора.

Медленный метод заключается в использовании pow() function

value = pow(2,16) - pow(2,10) + value

Метод, зависящий от компилятора:

 value = (value << 6) >> 6 (right shift shifts the MSB which is a compiler dependent operation and may shift 0 if compiler is different)

Может кто-нибудь помочь мне найти стандартный способ приведения нестандартных типов к стандартным типам

Ответы [ 2 ]

1 голос
/ 07 января 2020

Вот лог c для явно записанных операций. Очевидно, что вы можете сделать это с помощью одной строки, но я надеюсь, что это объясняет почему .

#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main(int argc, char* argv[]) {   
    //int16_t  value = 0x3fdb; // random examples
    //int16_t  value = 0x00f3;
    int16_t  value = 0x3f3;
    printf("0x%04x (%i)\n", value, value); // in
    uint16_t mask  = 0x3ff; // 0000 0011 1111 1111 in binary
    uint16_t masked = value & mask; // get only the 10 LSB
    uint16_t extension = (0x200 & value) ? 0xFC00 : 0x0; // extend with 1s or 0s
    printf("extension: %i\n", (extension)?1:0);
    int16_t  extended = extension | masked; // do the extension
    printf("0x%04x (%i)\n", extended, extended); // out

    return 0;
}

Примеры:

0x00f3 (243)
extension: 0
0x00f3 (243)

0x3fdb (16347)
extension: 1
0xffffffdb (-37)

0xfffffff3 (-13)
extension: 1
0xfffffff3 (-13)

0x03f3 (1011)
extension: 1
0xfffffff3 (-13)
1 голос
/ 07 января 2020
value = value & 0x03FF; //mask off the high 6 bits like you want.

Не должно быть 10-битных целых чисел, я предполагаю, что значение короткое, но вы должны добавить соответствующую информацию.

edit Если вы хотите замаскировать только 10-ю бит установлен тогда:

value = (value & 0x0200) ? (value & 0x03FF) : value;
...