Bor*_*iga 3 c++ bitwise-operators
这些是在Dev-cpp C++ 5.4.2上编写的两个简单的C++示例:
float a, b, c;
if (a | b & a | c)
printf("x = %.2f\tF = %.0f\n", x, F);
else
printf("x = %.2f\tF = %.2f\n", x, F);
Run Code Online (Sandbox Code Playgroud)
而这段代码:
float a, b, c;
if (a || b && a || c)
printf("x = %.2f\tF = %.0f\n", x, F);
else
printf("x = %.2f\tF = %.2f\n", x, F);
Run Code Online (Sandbox Code Playgroud)
有谁能告诉我之间的差异||> |和&> &&.第二个代码有效,但首先没有.编译器给出了一条错误消息:
[错误]类型'float'和'float'到二进制'运算符&'的操作数无效.
JSF*_*JSF 11
运营商|,&和~作用于平行的各个位.它们只能用于整数类型. a | b每个位的独立OR运算a与相应的位进行,b以产生该位的结果.
运算符||,&&并!作为单个true/ false值作用于每个操作数.可以使用隐式转换为的任何数据类型bool.许多数据类型,包括float使用隐含!=0操作隐式转换为bool .
||并且&&还"短路".这意味着只要第一个操作数可以确定结果的值,就不会计算第二个操作数.例:
ptr && (*ptr==7) 如果ptr为零,则结果为false,而没有任何因解除引用零而导致段错误的风险.
你可以与之形成对比(int)ptr & (*ptr).忽略这个甚至是想要的奇怪操作的事实,如果(int)ptr为零,则整个结果将为零,因此人们可能认为在这种情况下你不需要第二个操作数.但无论如何,该计划可能会计算两者.
您似乎对运算符的符号感到困惑。这些符号实际上分为两个不同的类别,即按位运算符和逻辑运算符。尽管它们使用相同的符号,但您应该将它们视为不同的运算符。两个类别的真值表相似,但含义不同。也许这就是为什么人们对运算符使用类似的符号。
~ // NOT
& // AND
| // OR
^ // XOR
Run Code Online (Sandbox Code Playgroud)
按位运算符将其所有操作数视为二进制数字,并根据操作数每一位的按位真值表进行操作。
Bit-wise Truth Table
x y x&y x|y x^y
0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 1 0
x ~x
0 1
1 0
Run Code Online (Sandbox Code Playgroud)
! // Logical NOT (negation)
&& // Logical AND (conjunction)
|| // Logical OR (disjunction)
Run Code Online (Sandbox Code Playgroud)
逻辑运算符会将其所有操作数视为布尔值,并根据运算符真值表进行操作。任何不等于的数字都0将是true,否则将是false。
Logical Truth Table
x y x&&y x||y
F F F F
T F F T
F T F T
T T T T
x !x
F T
T F
Run Code Online (Sandbox Code Playgroud)
例如:
int a = 10; // a = 0000 .... 0000 1010 <-- a 32 bits integer
// a is not zero -> true
int b = 7; // b = 0000 .... 0000 0111 <-- a 32 bits integer
// b is not zero -> true
Run Code Online (Sandbox Code Playgroud)
那么对于按位运算符:
assert(a & b == 2); // 2 = 0000 .... 0000 0010 <-- every bit will & separately
Run Code Online (Sandbox Code Playgroud)
对于逻辑运算符:
assert(a && b == true); // true && true -> true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16175 次 |
| 最近记录: |