将十进制值编码为固定数量的位

时间:2014-01-15 00:00:38

标签: c encoding bit-manipulation

我和我需要解决的更年长的人之间存在激烈的,持续的分歧。因此,我转向你的互联网。不要让我失望!

目标是取十进制值并将其编码为24位。它是一个简单的线性标度,因此0x000000是最小值,0xFFFFFF是最大值。

我们都同意如何实现这个目标的基本公式:(最大 - 最小)/范围。问题是分母。另一方说这应该是1<< 24(一个左移24位)。这产生了16777216.我认为(以前已经看过这个)分母应该是0xFFFFFF,或16777215。

谁是对的?

3 个答案:

答案 0 :(得分:4)

如您所述,分母肯定应该是16777215。 2 ^ 24是16777216但该数字不能用24位数表示。最大数字是2 ^ 24 - 1(16777215)或0xFFFFFF,就像你说的那样。

答案 1 :(得分:3)

我的第二个@ Tejolote的回答,因为将1移位0次或更多次会得到1到1677216之间的范围。

(32-bit number)
0000 0000 0000 0000 0000 0000 0001 // (1 << 0)
0001 0000 0000 0000 0000 0000 0000 // (1 << 24)

如果你得到这24位的位掩码,你会得到1到0的范围(可能不是你想要的):

  (mask to a 24-bit number)
  0000 0000 0000 0000 0000 0000 0001 // (1 << 0)
& 0000 1111 1111 1111 1111 1111 1111 // mask
  ==================================
  0000 0000 0000 0000 0000 0000 0001 // result of '1', correct

  0001 0000 0000 0000 0000 0000 0000 // (1 << 24)
& 0000 1111 1111 1111 1111 1111 1111 // mask
  ==================================
  0000 0000 0000 0000 0000 0000 0000 // result of '0', wrong

您想要的是0到16777215的范围:

& 0000 0000 0000 0000 0000 0000 0000 // (1 << 0) - 1
  0000 1111 1111 1111 1111 1111 1111 // mask
  ==================================
  0000 0000 0000 0000 0000 0000 0000 // result of '0', correct

  0000 1111 1111 1111 1111 1111 1111 // (1 << 24) - 1
& 0000 1111 1111 1111 1111 1111 1111 // mask
  ==================================
  0000 1111 1111 1111 1111 1111 1111 // result of '16777215', correct

答案 2 :(得分:1)

OP&#34;所以,让我们说我为汽车编码速度。 0.0 mph为0x000000,150.0mph将由0xFFFFFF表示。它是一个简单的线性标度。&#34;

是16777215 = 0xFFFFFF - 0x000000

0.0 --> 0x000000
150.0 --> 0xFFFFFF

y = dy/dx(x - x0) + y0 = (0xFFFFFF - 0x000000)/(150.0 - 0.0)*(x - 0.0) + 0x000000

但如果大四学生认为高端的十进制值代表了人们可以接近的速度,而不是达到。

0.0 --> 0x000000
150.0 --> 0xFFFFFF + 1

16777216 = 0xFFFFFF + 1 - 0x000000

我建议购买你的高级啤酒。向他们学习 - 他们作弊