跳转至

逻辑运算符与位运算符

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/logical-vs-bitwise-operators

46083 为本文评分:

3.4

逻辑运算符与位运算符

匿名 2015年3月12日,星期四

在 IDL 中存在两种不同类型的比较运算符:位运算符和逻辑运算符。

位运算符 根据运算符定义的逻辑对两个表达式的每个位进行求值。这类运算符包括 AND、OR、NOT 和 XOR。输入表达式的每个位都将独立于其他位进行比较。IDL 总会对两个表达式都进行求值。

逻辑运算符 与位运算符非常相似,也是用于对两个条件进行求值。IDL 的逻辑运算符包括 &&(逻辑与)、||(逻辑或)和 ~(逻辑非)。逻辑运算符与位运算符有两个显著区别。首先,逻辑运算符总是返回 1(真)或 0(假)。其次,逻辑运算符执行“短路”逻辑,这意味着如果仅检查第一个条件后结果已知,则忽略第二个条件。例如,当使用逻辑与时,我们知道两个条件都必须为真,结果才为真;如果两个条件中的第一个求值为假,那么无论第二个条件如何,结果都将为假,因此不会对第二个条件进行求值。

除了效率稍高之外,逻辑与在需要先检查值是否存在再检查其条件时非常有用。例如,我有一个名为 var 的变量,我想写一个 IF 语句,当该变量大于 5 时执行。但是,在我的代码中,我不确定 var 是否存在,所以我必须先对其使用 N_ELEMENTS 进行检查。使用逻辑与,可以在一行内完成此操作。

IF N_ELEMENTS(var) GT 0 && var GT 5 THEN BEGIN
   ; ...
ENDIF

如果上面的代码中 var 不存在,那么 IDL 就不会去检查 var 是否大于 5。如果使用了位与运算符,IDL 在检查 if 语句的后半部分时就会抛出一个未定义变量的错误。要使用 AND,这个逻辑需要写在两行不同的代码中。

IF N_ELEMENTS(var) GT 0 THEN BEGIN
  IF var GT 5 THEN BEGIN
    ; ...
  ENDIF
ENDIF

那么什么时候会想使用位运算符呢?

首先,逻辑运算符仅适用于每个表达式结果为标量的情况。例如,如果我想使用 WHERE 语句来检查数组的两个不同条件,那么就需要使用位运算符。

arr = INDGEN(6)
result = WHERE(arr GT 1 AND arr LT 4)

在上述表达式中用 && 替换 AND 会导致错误。

在不太常见的情况下,条件表达式可能是两个不同函数的结果,并且你希望两个函数始终被执行,而不是被跳过(也许这些函数在通过引用传递时对变量做了某些操作,或者它们可能根据输入改变了内部变量),那么你可以使用位运算符将它们组合在一起。

IF my_function1(var) AND my_function2(var) THEN BEGIN
  ; ...
ENDIF

注意,如果你希望其中一个总是运行,但不关心第二个,你可以使用逻辑运算符,并把总是要执行的那个放在第一位。

你甚至可以用位运算逻辑玩些花样。因为位运算逻辑对每个值的所有位进行操作,并且是独立于其他位进行的,所以你会得到有趣的结果。例如:

PRINT, 3 AND 6

IDL 将打印 2。这是因为 3 的二进制是 011,6 的二进制是 110。结果是...(第一位):0 AND 1 = 0,(第二位):1 AND 1 = 1,(第三位):1 AND 0 = 0... 010,即 2。在处理图像数据以修改某些颜色时,这有时会派上用场。一个非常有用的例子是,逻辑 NOT 会将照片转换为负片。

最后请注意,当在同一行代码中执行多个操作时,IDL 会遵循运算符优先级,类似于数学中的运算顺序。

时间感知分析 - 不仅仅是可视化 无人机系统和云有什么共同点?