位运算符
2015-08-22 12:02
190 查看
位运算符
& 按位与:一假则假| 按位或:一真则真
^按位异或:不同则真
多个数异或的结果和异或的顺序无关;
相同整数按位异或结果为0;
任何正数异或0,结果不变;
任何整数按位异或上另一个整数两次,结果不变;
~ 按位取反:
<< 左移
a << n 把整数a的二进制位往左边移n位,移出的位丢掉,低位补0, 左移会把原有的数值变大
9 << 1 = 18 9 * 2(1) = 18
9 << 2 = 36 9 * 2(2) = 26
9 << n = 9 * 2(n)
左移的应用场景:当要计算某个数乘以2的n次方的时候就用左移,效率最高
注意点:左移有可能改变数值的正负性
右移 >>
a >> n 把整数a的二进制位往右边移n位;移出的位砍掉,缺少的以为最高位是0就补0是1就补1(是在当前操作系统下)
9 >> 1 = 4 9 / 2(1) = 4
9 >> 2 = 2 9 / 2(2) = 2
右移的应用场景:当要计算某个数除以2的N次方的时候就用右移,效率最高
案例:要求定义一个函数,传入一个整数,输出该整数的二进制
#include "stdio.h" void printBinay(int value); int main() { /* 0000 0000 0000 0000 0000 0000 0000 1001 &0000 0000 0000 0000 0000 0000 0000 0001 // 1.让9的二进制向右移31,就可以获取到9得最高位的二进制,然后让9的二进制的最高位和1相&,那么就可以获得9的最高位 // 2.让9的二进制向右移30,就可以获得9二进制的第二位 // 3.以此类推, 直到0位置 技巧: 1.任何数与1相&都是那个数 2.利用位移取出每一位 */ int num = 15; printBinay(num); return 0; } void printBinay(int value) { // 1.定义变量需要向右移动的位数 int offset = 31; // 2.通过循环取出每一位 while (offset >= 0) { int result = (value >> offset) & 1; printf("%i", result); // 3.每次取出一位就让控制右移的变量-1 offset--; if ((offset+1) % 4 == 0) { printf(" "); } } printf("\n"); }
案例2:
// 要求交换两个变量的值 #include "stdio.h" int main() { int a = 10; int b = 5; printf("交换前:a = %i , b = %i\n", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("交换前:a = %i , b = %i\n", a, b); return 0; }
相关文章推荐
- Lua中关系运算符的使用教程
- Lua学习笔记之运算符和表达式
- C#运算符重载用法实例分析
- 使用位运算实现网页中的过滤、筛选功能实例
- sql server 2008中的apply运算符使用方法
- C#中38个常用运算符的优先级的划分和理解
- C#基础语法:as 运算符使用实例
- 与MSSQL对比学习MYSQL的心得(五)--运算符
- MySQL中的运算符使用实例展示
- Ruby的运算符和语句优先级介绍
- C#枚举中的位运算权限分配浅谈
- Lua中的运算符简明总结
- javascript 全等号运算符使用说明
- JS按位非(~)运算符与~~运算符的理解分析
- javascript &&和||运算法的另类使用技巧
- C#重载运算符详解
- JavaScript运算符小结
- shell 基本计算、逻辑运算、位运算详解
- JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
- JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)