将14位转换为8位并返回

时间:2013-04-23 09:18:05

标签: c bit-manipulation

我写了一些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;

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

如果我们使用转换后的LSBMSB转换回来,您的代码就能正常运行。

根据您的问题,我假设如果数据MSB和LSB是用户输入的值,那么您需要丢弃dataMSB的2位,而不是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);
}