2013-04-23 3 views
1

Я написал код C, где у меня есть 14-разрядное число, которое я хочу преобразовать в 2-битные байты, где два msb должны быть равны нулю. Другими словами, 16383 (В двоичном файле 111111111111111) должен выдаваться как MSB = 00111111 и LSB = 11111111. Код, который я использую, показан ниже. Это верно?Преобразование 14 бит в 8 бит и обратно

dataMSB = (number>>8) & 0x00FF; 
dataLSB = number & 0x00FF; 

Тогда у меня есть еще 14-разрядное число, которое вводится в виде двух 8-битовых байтов, где два LSB-х должны быть выброшены. Здесь я вполне уверен, что делаю это неправильно, но я не уверен. Есть идеи?

number = dataMSB << 8; 
number += dataLSB; 
+0

Почему вы думаете, что в обратном преобразовании вам нужно бросить 2 LSB? Как я вижу, на самом деле 2 MSB нечетны в преобразовании. – Alex

+0

Что именно вы подразумеваете под словом «два lsb должны быть отброшены»? Можете ли вы привести пример? – interjay

+1

Ваш код работает отлично. кстати, каков ваш вопрос? – Dipto

ответ

0

Простой тест на IDEOne показывает, что ваш код работает правильно.

int number = 16000; 

int dataMSB = (number >> 8) & 0x00FF; 
int dataLSB = number & 0x00FF; 

// This prints 62 and 128, which is an expected result. 
// 62 = 00111110 
// 128 = 10000000 
cout << dataMSB << " " << dataLSB << endl; 

number = dataMSB << 8; 
number += dataLSB; 

// This prints 16000 as expected. 
cout << number << endl; 
0

Ваш код прекрасно работает, если мы используем преобразованную LSB и MSB преобразовать обратно.

Из Вашего вопроса, я полагаю, что если данные MSB и LSB, вводятся пользователем значение, то вам нужно выбросить 2 бита из dataMSB, не из dataLSB. Для этого вам, возможно, потребуется сделать следующее:

number = (dataMSB & 0x003F)<< 8; 
number += dataLSB; 

и это даст вам отличный результат и если dataMSB 8 битов длиной, например 255.

Я использовал следующее испытание. двоичный файл напечатан в обратном порядке:

#include <stdio.h> 
#include <stdlib.h> 

#define BIT(i) (1<<(i)) 

void PrintBin(const int num) 
{ 
    int value = num; 
    char bin[17]="0000000000000000"; 
    int i; 
    for (i=0;i<16;i++) 
     bin[i]= (value & BIT(i))? '1':'0'; 
    bin[16]='\0'; 
    printf("%d::%s\n",num,bin); 
} 

void main() 
{ 
    int dataMSB, dataLSB; 
    int number = 16383; 
    int number1 =0; 
    PrintBin(number); 
    dataMSB = (number>>8) & 0x00FF; 
    dataLSB = number & 0x00FF; 
    PrintBin(dataMSB); 
    PrintBin(dataLSB); 
    dataMSB =255; 
    number1 =(dataMSB & 0x003F) << 8; 
    number1 += dataLSB; 
    PrintBin(number1); 
} 
Смежные вопросы