C++ 中的算法与按位运算符

Algorithm in c++ with bitwise operators

我的教授分配了下周的这项任务。您必须创建变量,并在一个表达式中创建一个算法,在计算给定的 x、y、z 时给出 1(真),并且在 x、y、z 的每个其他状态下,结果为 0。仅使用按位运算符(| , &).

x = 1
y = 0
z = 0
result 1

x = 0
y = 1
z = 0
result 1

x = 0
y = 1
z = 1
result 1 

其他一切都应为 0(假)!我们不应该使用任何函数、循环、开关或其他任何东西。只需 1 行表达式。 他说我们应该使用 9 个变量和 8 个操作,所以我猜算法应该是这样的:

(xOyOz) O (xOyOz) O (xOyOz)

这给出了9个变量3*x3*y3*z和8个操作8*O(下面其中一个应该在这个地方|,&)

您可以使用 ^ (XOR) 运算符。

((x^y)&(x^z))|(y&(x^y)&(y^z))

正好是 9 个变量和 8 个操作

基本思路是,对于每 1 个结果:

  1. & 将所有位变量一起设为 1(not 任何 0 使它们与 ~ 一起成为 1)。
  2. 然后|这些组在一起。
  3. 可选择将此通用解决方案重构为更简单的形式。

这不仅会为所有给定的 1 个结果提供 1 个结果,还会为所有其他组合提供 0 个结果。

因此在这种情况下(未优化的)按位表达式是:

(x & ~y & ~z) | (~x & y & ~z) | (~x & y & z)

这被称为 Karnaugh Map,不仅广泛用于位操作,而且还用作任何类型数据的通用布尔过滤器。