C语言学习-位运算

251 阅读2分钟

2.10.5 位运算符:

1. 位运算符介绍:

C语言中的位运算符有:
左移<<右移>>按位取反~按位或|按位异或^按位与&

1.1 C语言中运算符的解释:

左移<<n:表示将二进制数左移n位,高位丢弃,低位补 0,相当于乘以 2。
工作中很多时候申请内存时会用左移,例如要申请 1GB 大小的空间,可以使用 malloc(1<<30)malloc 函数在C语言中用来分配内存空间。
image.jpeg 右移>>n:表示将二进制数右移n位,低位丢弃,正数的高位补 0,负数的高位补 1相当于除以 2
移位比乘法和除法的效率要高,负数右移对偶数来说是除以 2,但对奇数来说是先减 1 后除以 2
例如,-8>>1,得到的是-4,但-7>>1 得到的并不是-3 而是-4。另外,对于-1 来说,无论右移多少位,值永远为-1。
异或^:相同的数进行异或时,结果为 0,任何数和0异或的结果是其本身
按位取反:数位上的数是 1 变为 00 变为 1
按位与和按位或:用两个数的每一位进行与和或

2. 位运算相关算法题:

  1. 给定一个整数n,如果是2的幂,返回true,否则返回false
    分析,2的幂有什么特征?
  2. 2的0次幂为1,所以这个数必然大于等于1
  3. 如果他是2的幂,那她的二进制表示必然为:1加上若干个零,则其减一,就变成了0加上个若干个一
    image.png并且将减一前后的二进制做与运算,得到的结果为0,也就是说,只要是2的幂,都符合这一特征 image.png 因此,只要将输入的数的二进制减一,然后前后做与运算,结果为0,则为2的幂,否则不是 也就是:若整数n位于上(n-1),为0则返回true,否则返回false

3.代码实现:

int main()  
{  
int n = 0;  
printf("请输入要判断的整数:");  
scanf("%d",&n);  
if(n > 0 && (n & (n-1)) == 0){ // 根据运算符的优先级,运算操作外面要加括号  
  
printf("true");  
} else{  
  
printf("false");  
}  
  
  
return 0;  
}  
// 测试:符合预期  
  
//请输入要判断的整数:8  
//true  
  
//请输入要判断的整数:9  
//false`