使用按位与运算符1

3
如果x是一个浮点数,那么
y = x & 1

除了检查x是否为奇数之外,它还有其他用途吗?

我刚刚阅读了使用位或0来向下取整一个数字,想知道是否还有其他有趣的位操作?

2个回答

2
如果 x 是逻辑上的浮点数(在测试之前不打算成为整数值),& 1 的唯一目的是确定截断值是否为奇数(它是一个组合的截断和按位测试)。它并没有说 x 是否为奇数(-2.9 既不是奇数也不是偶数,-3.9 也不是,而且它们给出相反的结果),它也不仅仅是截断(因为它抛弃了除一个数据位以外的所有数据位);测试本质上结合了两种效果,并且在 x 是任意浮点数值时没有其他用处。
正如其他答案所提到的,按位操作有其他合法的用途,例如加密或将整数重新用作布尔标志的向量,但这只适用于逻辑上的整数值;执行浮点数学运算,然后依赖截断后的特定整数值(无需舍入)是一个可怕的想法,当结果变成 X.9999999999999999999999994 而你期望它是(根据“小学”数学,它应该是)X+1 时,它会让你措手不及。

2
您可以使用位运算符来编码选项和标志。
例如:编码汽车功能。
automaticWindows = 0b1; // 1
manualTransmission = 0b10; // 2
hasAC = 0b100; // 4
hasHeater = 0b1000; // 8

如果我的汽车只有自动窗户和空调,那么我会这样做:
myCarOptions = automaticWindows | hasAC;

那要判断某辆随机的汽车是否有空调,我可以这样做:

if (randomCarOption & hasAC) {
  // do something... like turn on AC
}

归根结底,位运算符只是让您可以使用各种位进行逻辑操作,这是计算机工作的核心。


该 OP 假设 x 是一个逻辑浮点数。你不会使用逻辑浮点数来存储标志。这是按位与的合理用法,但在这种情况下,值始终是逻辑整数或标志是无意义的。 - ShadowRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接