2.10.5 位运算符:
1. 位运算符介绍:
C语言中的位运算符有:
左移:<<、右移:>>、按位取反:~、按位或:|、按位异或:^、按位与:&。
1.1 C语言中运算符的解释:
左移<<n:表示将二进制数左移n位,高位丢弃,低位补 0,相当于乘以 2。
工作中很多时候申请内存时会用左移,例如要申请 1GB 大小的空间,可以使用 malloc(1<<30)。malloc 函数在C语言中用来分配内存空间。
右移
>>n:表示将二进制数右移n位,低位丢弃,正数的高位补 0,负数的高位补 1,相当于除以 2。
移位比乘法和除法的效率要高,负数右移对偶数来说是除以 2,但对奇数来说是先减 1 后除以 2。
例如,-8>>1,得到的是-4,但-7>>1 得到的并不是-3 而是-4。另外,对于-1 来说,无论右移多少位,值永远为-1。
异或^:相同的数进行异或时,结果为 0,任何数和0异或的结果是其本身。
按位取反:数位上的数是 1 变为 0,0 变为 1。
按位与和按位或:用两个数的每一位进行与和或。
2. 位运算相关算法题:
- 给定一个整数n,如果是2的幂,返回true,否则返回false
分析,2的幂有什么特征? - 2的0次幂为1,所以这个数必然大于等于1
- 如果他是2的幂,那她的二进制表示必然为:1加上若干个零,则其减一,就变成了0加上个若干个一
并且将减一前后的二进制做与运算,得到的结果为0,也就是说,只要是2的幂,都符合这一特征
因此,只要将输入的数的二进制减一,然后前后做与运算,结果为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`