位运算(C/C++)
2016-07-09 23:19
232 查看
位运算的使用过程中有一些细节没注意就被坑了,于是记下备忘。
主要的位运算是:‘>>’, ‘<<’, ‘^’, ‘&’, ‘|’
移位运算:左移(‘<<’),右移(‘>>’)
从结果可以看到的是移动n位的运算会在“整体移动,移出n位,空出的位填充0”
异或运算:‘^’、与运算:‘&’、或运算:‘|’
从上面的两个例子可以总结出:“对于unsigned的无符号数进行数位扩大的强制类型转换时是填充的0,位有符号的数在相同条件下填充1”
再接着就是,与运算‘&’主要运用于提取(或清除)数据,或运算则‘|’是合并:
主要的位运算是:‘>>’, ‘<<’, ‘^’, ‘&’, ‘|’
移位运算:左移(‘<<’),右移(‘>>’)
uint16_t a = 0x00FF; uint16_t b = a << 8; uint16_t c = a >> 8; cout << hex << a << endl; cout << hex << b << endl; cout << hex << c << endl; //对应的输出是ff, ff00, 0 //
从结果可以看到的是移动n位的运算会在“整体移动,移出n位,空出的位填充0”
异或运算:‘^’、与运算:‘&’、或运算:‘|’
typedef unsigned short uint16_t; typedef unsigned char uint8_t; uint8_t a = 0xFF; uint16_t b = 0xFF00; uint16_t c = ((uint16_t)a) ^ b; uint16_t d = ((uint16_t)a) & b; uint16_t e = ((uint16_t)a) | b; cout << hex << ((uint16_t)a) << endl; cout << hex << c << endl; cout << hex << d << endl; cout << hex << e << endl; //对应的输出是ff, ffff, 0, ffff char a = 0xFF; uint16_t b = 0xFF00; uint16_t c = ((uint16_t)a) ^ b; uint16_t d = ((uint16_t)a) & b; uint16_t e = ((uint16_t)a) | b; cout << hex << ((uint16_t)a) << endl; cout << hex << c << endl; cout << hex << d << endl; cout << hex << e << endl; //对应的输出是ffff, ff, ff00, ffff
从上面的两个例子可以总结出:“对于unsigned的无符号数进行数位扩大的强制类型转换时是填充的0,位有符号的数在相同条件下填充1”
再接着就是,与运算‘&’主要运用于提取(或清除)数据,或运算则‘|’是合并:
typedef unsigned short Unicode; Unicode charToUni(char tmp[3])//将2个char合并为Unicode { return (((Unicode)tmp[0] << 8) | ((Unicode)tmp[1] & 0x00FF)); }//((Unicode)tmp[1] & 0x00FF))这里是因为char是有符号的,在运算时会自动填充“1”,故需要将高8位清零,并提取(保留)低8位 void UniToChar(Unicode word, char tmp[3])//将Unicode转换提取出2个char { tmp[0] = (word >> 8); tmp[1] = (word & 0xFF); tmp[2] = '\0'; return; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Linux C函数参考手册(PDF版)
- C# partial关键字说明
- Lua中调用C++函数示例
- Lua教程(十七):C API简介
- 简单谈谈lua和c的交互
- Lua教程(一):在C++中嵌入Lua脚本
- C#用链式方法表达循环嵌套
- Lua教程(二):C++和Lua相互传递数据示例
- 使用位运算实现网页中的过滤、筛选功能实例
- C#中的委托数据类型简介
- C++联合体转换成C#结构的实现方法
- C#编写的艺术字类实例代码
- C#实现打造气泡屏幕保护效果
- 举例讲解C#编程中委托的实例化使用
- 使用C#代码获取存储过程返回值