我和一个更年长的人之间有一个激烈的,持续的分歧,我需要解决。所以,我转向你们的互联网别让我失望!
目标是获取一个十进制值并将其编码为24位。这是一个简单的线性比例,因此0x000000是最小值,0xFFFFFF是最大值。
我们都同意实现这一点的基本公式:(max min)/range。问题是分母。另一方说应该是1<谁是对的?

最佳答案

我支持@Tejolote的答案,因为移动a10或更多次将给您一个介于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

10-01 09:49