需要解释代码中的移位语法 - C++
Need an explanation on a shift syntax in code - C++
我需要对我不太理解的代码做进一步的解释。
这是一个接受 num = 25
并开始使用 <<
语法向左移动的程序。
#include <iostream>
using namespace std;
int main(){
cout << "Shift to the left" << endl;
short numb = 25;
cout << "Starting value: ";
for (int i = sizeof(short)*8 - 1; i >= 0; i--)
cout << (((1 << i) & numb) == 0 ? "0" : "1");
cout << " " << numb << endl;
for (int i = 0; i < sizeof(short)*8; i++){
numb <<= 1;
cout << "Shift" << (i+1 < 10 ? "0" : "")
<< i+1 << " : ";
for (int i = sizeof(short)*8 - 1; i >= 0; i--)
cout << (((1 << i) & numb) == 0 ? "0" : "1");
cout << " " << numb << endl;
}
return 0;
}
在执行第一个 for 循环的行(count 行)之后,& 语法考虑什么值? ((1 << i) & 麻木)
我不明白程序怎么可以取 ((1 << i) & numb),比较两者和 return 一个值。
另外,为什么我们声明 i 为 sizeof(short)*8 - 1?我们为什么不直接输入 16-1?这样做有特定的原因还是只是为了让代码看起来更复杂?
并解释为什么我们甚至宣布 i 为 15-1 将非常感激。
希望我没有给你太多,我是一个初学者,我需要一些指导来解决一些我还不能自己想出答案的问题。
谢谢!
移位运算符是right-shift operator (>>)
,它将shift_expression的位向右移动,left-shift operator (<<)
将shift_expression的位移动到左边。还有两个复杂的运算符可用于将值直接分配给左边的值。这些是 <<= operator
和 >>= operator
。
左移运算符使 shift-expression 中的位向左移动由 additive-expression 指定的位置数。由移位操作腾出的位位置用零填充。左移是逻辑移位(移出末尾的位被丢弃,包括符号位)。
右移运算符使 shift-expression 中的位模式向右移动由 additive-expression 指定的位置数。对于无符号数,移位操作空出的位用零填充。对于有符号数,符号位用于填充空位。换句话说,如果数字是正数,则使用0,如果数字是负数,则使用1。
演示代码:
using namespace std;
int main() {
int a = 1, b = 3;
// a right now is 00000001
// Left shifting it by 3 will make it 00001000, ie, 8
a = a << 3;
cout << a << endl; // Gives output 8
// Right shifting a by 2 will make it 00000010, ie, 2
a = a >> 2;
cout << a << endl; // Gives output 2
return 0;
}
带符号负数右移的结果取决于实现。如果您左移一个带符号的数字以影响符号位,则结果未定义。
我需要对我不太理解的代码做进一步的解释。
这是一个接受 num = 25
并开始使用 <<
语法向左移动的程序。
#include <iostream>
using namespace std;
int main(){
cout << "Shift to the left" << endl;
short numb = 25;
cout << "Starting value: ";
for (int i = sizeof(short)*8 - 1; i >= 0; i--)
cout << (((1 << i) & numb) == 0 ? "0" : "1");
cout << " " << numb << endl;
for (int i = 0; i < sizeof(short)*8; i++){
numb <<= 1;
cout << "Shift" << (i+1 < 10 ? "0" : "")
<< i+1 << " : ";
for (int i = sizeof(short)*8 - 1; i >= 0; i--)
cout << (((1 << i) & numb) == 0 ? "0" : "1");
cout << " " << numb << endl;
}
return 0;
}
在执行第一个 for 循环的行(count 行)之后,& 语法考虑什么值? ((1 << i) & 麻木) 我不明白程序怎么可以取 ((1 << i) & numb),比较两者和 return 一个值。
另外,为什么我们声明 i 为 sizeof(short)*8 - 1?我们为什么不直接输入 16-1?这样做有特定的原因还是只是为了让代码看起来更复杂? 并解释为什么我们甚至宣布 i 为 15-1 将非常感激。
希望我没有给你太多,我是一个初学者,我需要一些指导来解决一些我还不能自己想出答案的问题。
谢谢!
移位运算符是right-shift operator (>>)
,它将shift_expression的位向右移动,left-shift operator (<<)
将shift_expression的位移动到左边。还有两个复杂的运算符可用于将值直接分配给左边的值。这些是 <<= operator
和 >>= operator
。
左移运算符使 shift-expression 中的位向左移动由 additive-expression 指定的位置数。由移位操作腾出的位位置用零填充。左移是逻辑移位(移出末尾的位被丢弃,包括符号位)。
右移运算符使 shift-expression 中的位模式向右移动由 additive-expression 指定的位置数。对于无符号数,移位操作空出的位用零填充。对于有符号数,符号位用于填充空位。换句话说,如果数字是正数,则使用0,如果数字是负数,则使用1。
演示代码:
using namespace std;
int main() {
int a = 1, b = 3;
// a right now is 00000001
// Left shifting it by 3 will make it 00001000, ie, 8
a = a << 3;
cout << a << endl; // Gives output 8
// Right shifting a by 2 will make it 00000010, ie, 2
a = a >> 2;
cout << a << endl; // Gives output 2
return 0;
}
带符号负数右移的结果取决于实现。如果您左移一个带符号的数字以影响符号位,则结果未定义。