我写了一些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;
答案 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)
如果我们使用转换后的LSB
和MSB
转换回来,您的代码就能正常运行。
根据您的问题,我假设如果数据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);
}