📜  C / C++中的左移和右移运算符

📅  最后修改于: 2021-05-25 10:48:06             🧑  作者: Mango

左移 :

表示为:<<

例如: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等的更多准备工作,请参阅“完整面试准备课程”