8位BCD检查

Fer*_*ada 2 c c++ bcd

我有一个8位数的BCD号码,需要查看它是否是有效的BCD号码.我怎样才能以编程方式(C/C++)制作这个?

例如:0x12345678有效,但0x00f00abc不是.

提前致谢!

Mar*_*som 10

您需要检查每个4位数量以确保它小于10.为了提高效率,您希望一次处理尽可能多的位.

在这里,我将数字分开以在每个数字之间留下零,然后为每个数字加6并检查溢出.

uint32_t highs = (value & 0xf0f0f0f0) >> 4;
uint32_t lows = value & 0x0f0f0f0f;
bool invalid = (((highs + 0x06060606) | (lows + 0x06060606)) & 0xf0f0f0f0) != 0;
Run Code Online (Sandbox Code Playgroud)

编辑:实际上我们可以做得更好.它不需要4位来检测溢出,只有1.如果我们将所有数字除以2,它会释放一些,我们可以立即检查所有数字.

uint32_t halfdigits = (value >> 1) & 0x77777777;
bool invalid = ((halfdigits + 0x33333333) & 0x88888888) != 0;
Run Code Online (Sandbox Code Playgroud)