1

我已经编写了一些 C 代码,其中我有一个 14 位数字,我想将其转换为 2 位字节,其中两个 msb 必须为零。换句话说,16383(二进制 111111111111111)应该以 MSB = 00111111 和 LSB = 11111111 的形式出现。我使用的代码如下所示。这个对吗?

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

然后我有另一个 14 位数字作为两个 8 位字节输入,两个 lsb 需要被丢弃。在这里,我很确定我做错了,但不确定。有任何想法吗?

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

2 回答 2

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;
于 2013-04-23T09:45:24.590 回答
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);
}
于 2013-04-23T10:02:22.853 回答