位运算符
来源:互联网 发布:伊宁关键字排名优化 编辑:程序博客网 时间:2024/06/05 00:27
1 位运算符分析
- C语言中的位运算符:位运算符直接对bit位进行操作,其效率最高。
2 左移和右移注意点
左操作数必须为整数:char和short被隐式转换为int后进行移位操作。
右操作数的范围必须为:[0,31]。
- 左移运算符<<将运算数的二进制位左移:
- 规则:高位丢弃,低位补0。
- 右移运算符>>把运算数的二进制位右移:
- 规则:高位补符号位,低位丢弃。
3 有趣的问题
实例分析:位运算符初探
#include <stdio.h>int main(){ printf("%d\n", 3 << 2); //12 printf("%d\n", 3 >> 1); //1 printf("%d\n", -1 >> 1); //-1 printf("%d\n", 0x01 << 2 + 3); //32 printf("%d\n", 3 << -1); // oops! 不同编译器结果不同 return 0;}
4 小贴士
- 防错准则:
- 避免位运算符,逻辑运算符和数学运算符同时出现在一个表达式中。
- 当位运算,逻辑运算符和数学运算符需要同时参与运算时,尽量使用括号()来表达计算次序。
- 小技巧:
- 左移n位相当于乘以2的n次方,但效率比数学运算符高。
- 右移n位相当于除以2的n次方,但效率比数学运算符高。
编程实验:交换两个整型变量的值
#include <stdio.h>#define SWAP1(a, b) \{ \ int t = a; \ a = b; \ b = t; \}#define SWAP2(a, b) \{ \ a = a + b; \ b = a - b; \ a = a - b; \}#define SWAP3(a, b) \{ \ a = a ^ b; \ b = a ^ b; \ a = a ^ b; \}int main(){ int a = 1; int b = 2; printf("a = %d\n", a); printf("b = %d\n", b); SWAP3(a ,b); printf("a = %d\n", a); printf("b = %d\n", b); return 0;}
5 位运算与逻辑运算不同
- 位运算没有短路规则,每个操作数都参与运算。
- 位运算的结果为整数,而不是0或1。
- 位运算优先级高于逻辑运算优先级。
实例分析:混淆概念的判断条件
#include <stdio.h>int main(){ int i = 0; int j = 0; int k = 0; if( ++i | ++j & ++k ) { printf("Run here...\n"); } return 0;}
6 小结
- 位运算只能用于整数类型。
- 左移和右移运算符的右操作数范围必须为[0,31]。
- 位运算没有短路规则,所有操作数均会求值。
- 位运算的效率高于四则运算和逻辑运算。
- 运算优先级:四则运算 > 位运算 > 逻辑运算。
阅读全文
0 0
- 位运算符和位运算
- 位运算符和位运算
- 位运算符和位运算
- 位运算符和位运算
- 位运算符和位运算
- 位运算符和位运算
- 位运算符和位运算
- 位运算符与位运算
- sqlite位运算,sql位运算符
- 位运算符和位运算
- 位运算符和位运算
- 位运算、移位运算符
- Java位运算符
- 说说位运算符
- 位运算符
- Java 位运算符
- Java 位运算符
- Java 位运算符
- git的初始设置
- leetcode: 25. Reverse Nodes in k-Group [✗]
- 【十】机器学习之路——logistic回归python实现
- Myeclispe 导入css空指针异常 background: rgba(0, 0, 0, 0.3)
- 蓝桥杯 算法训练 Anagrams问题
- 位运算符
- redis的部分问题
- 数字图像处理之最近邻内插算法的实现
- 个人总结28
- 无法删除对象 'Student',因为该对象正由一个 FOREIGN KEY 约束引用。
- leetcode: 26. Remove Duplicates from Sorted Array
- 习题6;6.1
- C++中计算大数阶乘的较短代码
- LeetCode.508 Most Frequent Subtree Sum