我和我需要解决的更年长的人之间存在激烈的,持续的分歧。因此,我转向你的互联网。不要让我失望!
目标是取十进制值并将其编码为24位。它是一个简单的线性标度,因此0x000000是最小值,0xFFFFFF是最大值。
我们都同意如何实现这个目标的基本公式:(最大 - 最小)/范围。问题是分母。另一方说这应该是1<< 24(一个左移24位)。这产生了16777216.我认为(以前已经看过这个)分母应该是0xFFFFFF,或16777215。
谁是对的?
答案 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
我建议购买你的高级啤酒。向他们学习 - 他们作弊