~i 真的等同于 i != -1 吗?
Is ~i really equivalent to i != -1?
~i
在 C++ 中如何工作?
我刚刚注意到它等同于 i != -1
,但我不确定。
int arr[3] {1, 2, 3};
int n = 3;
for (int i = n - 1; ~i; i--) {
cout << arr[i] << ' ';
}
它反向打印数组。
~i
是按位非运算符。 IE。它反转 i
中的每一位。
-1 表示二进制,因为数字的每一位都设置为 1,将每一位反转为 0 得到 0。并且在预期 bool
的位置检查整数时,0 被视为 false
和任何其他编号为 true
.
所以,在这种特殊情况下,是的,~i
等同于 i != -1
。
~
是按位非运算符。当且仅当 i
的所有位都为 1 时,~i
为 0。 -1 是否所有位都为 1 取决于带符号数在系统上的表示方式。在二进制补码表示中,-1 用所有位 1 表示,因此在这样的系统上 ~(-1) == 0
。无论是补语还是 sign-and-magnitude 都不成立。
因此,答案是否定的;并非在所有系统上。也就是说,二进制补码在现代机器(自 90 年代以来制造的一切)中相当普遍,而在此类系统上,答案是肯定的。然而,不管符号表示如何,i != -1
更具可读性。
因为 for 循环中的 i 变量是 int 类型,它被定义为有符号整数,因此在二进制补码中,它的值 -1 的二进制表示是所有位集,这意味着所有位都是 1。另一方面,所有 1 的按位取反全为 0,这就是你需要的,循环执行直到 i>=0 或 i!=-1,因为你递减了 i。在对符号值进行按位运算的上下文中,系统具有 int 的二进制补码二进制表示,是的,它是相同的。
~i
在 C++ 中如何工作?
我刚刚注意到它等同于 i != -1
,但我不确定。
int arr[3] {1, 2, 3};
int n = 3;
for (int i = n - 1; ~i; i--) {
cout << arr[i] << ' ';
}
它反向打印数组。
~i
是按位非运算符。 IE。它反转 i
中的每一位。
-1 表示二进制,因为数字的每一位都设置为 1,将每一位反转为 0 得到 0。并且在预期 bool
的位置检查整数时,0 被视为 false
和任何其他编号为 true
.
所以,在这种特殊情况下,是的,~i
等同于 i != -1
。
~
是按位非运算符。当且仅当 i
的所有位都为 1 时,~i
为 0。 -1 是否所有位都为 1 取决于带符号数在系统上的表示方式。在二进制补码表示中,-1 用所有位 1 表示,因此在这样的系统上 ~(-1) == 0
。无论是补语还是 sign-and-magnitude 都不成立。
因此,答案是否定的;并非在所有系统上。也就是说,二进制补码在现代机器(自 90 年代以来制造的一切)中相当普遍,而在此类系统上,答案是肯定的。然而,不管符号表示如何,i != -1
更具可读性。
因为 for 循环中的 i 变量是 int 类型,它被定义为有符号整数,因此在二进制补码中,它的值 -1 的二进制表示是所有位集,这意味着所有位都是 1。另一方面,所有 1 的按位取反全为 0,这就是你需要的,循环执行直到 i>=0 或 i!=-1,因为你递减了 i。在对符号值进行按位运算的上下文中,系统具有 int 的二进制补码二进制表示,是的,它是相同的。