左移 :
表示为:<<
例如:N << i(N:第一个操作数,i:第二个操作数)
取两个数字,左移第一个操作数的位,第二个操作数决定移位的位数。或者换句话说,将整数“ x ”与表示为“ (x << y)”的整数“ y ”左移等效于将x乘以2 ^ y (2乘以幂y)。
例如:取N = 22 ;二进制格式为00010110 。
现在,如果“ N左移2 ”(即N = N << 2),则N将变为N = N *(2 ^ 2) 。因此, N = 22 *(2 ^ 2)= 88 ,可以写为01011000。
CPP
/* C++ Program to demonstrate use of left shift
operator */
#include
int main()
{
// a = 5(00000101), b = 9(00001001)
unsigned char a = 5, b = 9;
// The result is 00001010
printf("a<<1 = %d\n", a<<1);
// The result is 00010010
printf("b<<1 = %d\n", b<<1);
return 0;
}
CPP
/* C++ Program to demonstrate use of right
shift operator */
#include
using namespace std;
int main()
{
// a = 5(00000101), b = 9(00001001)
unsigned char a = 5, b = 9;
// The result is 00000010
printf("a>>1 = %d\n", a >> 1);
// The result is 00000100
printf("b>>1 = %d\n", b >> 1);
return 0;
}
C
#include
int main()
{
int x = 19;
unsigned long long y = 19;
printf("x << 1 = %d\n", x << 1);
printf("x >> 1 = %d\n", x >> 1);
// shift y by 61 bits left
printf("y << 61 = %lld\n", y << 61);
return 0;
}
C
#include
int main()
{
int i = 3;
printf("pow(2, %d) = %d\n", i, 1 << i);
i = 4;
printf("pow(2, %d) = %d\n", i, 1 << i);
return 0;
}
输出
a<<1 = 10
b<<1 = 18
右移:
表示为:>>
例如:N >> i(N:第一个操作数,i:第二个操作数)
取两个数字,右移第一个操作数的位,第二个操作数确定要移位的位数。换句话说,将整数“ x ”与表示为“ (x >> y) ”的整数“ y ”右移等效于将x除以2 ^ y。
例如:取N = 32 ;这是二进制形式的100000 。
现在,如果“ N右移2 ”,即N = N >> 2,则N将变为N = N /(2 ^ 2) 。因此, N = 32 /(2 ^ 2)= 8可以写成1000 。
CPP
/* C++ Program to demonstrate use of right
shift operator */
#include
using namespace std;
int main()
{
// a = 5(00000101), b = 9(00001001)
unsigned char a = 5, b = 9;
// The result is 00000010
printf("a>>1 = %d\n", a >> 1);
// The result is 00000100
printf("b>>1 = %d\n", b >> 1);
return 0;
}
输出
a>>1 = 2
b>>1 = 4
重要事项:
- 左移位运算符和右移位运算符不应用于负数。如果任何操作数为负数,则结果为未定义行为。例如,-1 << 1和1 << -1的结果均未定义。
- 如果数字移位的次数大于整数的大小,则行为是不确定的。例如,如果使用32位存储整数,则1 << 33是未定义的。对于较大值的位移,将1ULL << 62 ULL用于无符号长整型,它使用可存储大值的64位定义。
- 左移1和右移1等于第一项和2与给定元素的幂的乘积(1 << 3 = 1 * pow(2,3))以及第一项和第二项的除法分别提高到幂2(1 >> 3 = 1 / pow(2,3))。
如第1点所述,它仅在数字为正数时起作用。
C
#include
int main()
{
int x = 19;
unsigned long long y = 19;
printf("x << 1 = %d\n", x << 1);
printf("x >> 1 = %d\n", x >> 1);
// shift y by 61 bits left
printf("y << 61 = %lld\n", y << 61);
return 0;
}
输出
x << 1 = 38
x >> 1 = 9
y << 61 = 6917529027641081856
- i左移1等于提高到幂i的2。
如第1点所述,它仅在数字为正数时起作用。
C
#include
int main()
{
int i = 3;
printf("pow(2, %d) = %d\n", i, 1 << i);
i = 4;
printf("pow(2, %d) = %d\n", i, 1 << i);
return 0;
}
输出
pow(2, 3) = 8
pow(2, 4) = 16
关于C中按位运算符的有趣事实
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。