C++位操作技巧
2013-10-17 15:36
330 查看
一、注意事项:
a、与:&,两位都为1,才为1;
b、或:|,两位都为0,才为0;
c、微操作只能用于整形数据,float和double进行位操作时编译器会报错;
d、异或:^,两位相同为0,不同为1;
e、取反:~,1变为0,0变为1;
f、左移:<<,各二进制全部向左移位,高位丢失,低位补零;
g、右移:>>,各二进制全部向右移位,对于无符号数,低位丢失,高位补零;有符号数个编译器不同,有的补符号位,有的补0;
二、技巧用途:
1、判断奇偶:
只要判断二进制最末尾是0还是1即可判断,为0则是偶数,为1则为奇数;因此用if(a & 1) == 0代替if(a%2 == 0)来判断a是不是偶数。
输出1到100所有的奇数:
2、交换两个数(整形的)
3、变换符号:
整数变复数,复数变正数;操作是,对整数取反加1;
4、求绝对值:
方法一:
方法二:
a、与:&,两位都为1,才为1;
b、或:|,两位都为0,才为0;
c、微操作只能用于整形数据,float和double进行位操作时编译器会报错;
d、异或:^,两位相同为0,不同为1;
e、取反:~,1变为0,0变为1;
f、左移:<<,各二进制全部向左移位,高位丢失,低位补零;
g、右移:>>,各二进制全部向右移位,对于无符号数,低位丢失,高位补零;有符号数个编译器不同,有的补符号位,有的补0;
二、技巧用途:
1、判断奇偶:
只要判断二进制最末尾是0还是1即可判断,为0则是偶数,为1则为奇数;因此用if(a & 1) == 0代替if(a%2 == 0)来判断a是不是偶数。
输出1到100所有的奇数:
if(i = 0; i < 100; i++) if(i&1) printf("%d ", i);
2、交换两个数(整形的)
void swap(int &a, int &b){ a ^= b; b ^= a; a ^= b; }
3、变换符号:
整数变复数,复数变正数;操作是,对整数取反加1;
int signlReverse(int a){ return ~a + 1; }
4、求绝对值:
方法一:
int abs(int a){ int i >> 31;//获取符号位,a为正数i为0,a为负数i为-1 return i == 0 ? a : (~a + 1);//i为零表示正数直接返回a,为-1表示负数,返回其相反数; }
方法二:
int abs(int a){ int i >> 31;//获取符号位,a为正数i为0,a为负数i为-1 return ((a^i) - i);//如果a为正数,则i=0,a^i的值不变(任何数和0异或都不变),-i后a不变,返回a;如果a为负数,则i=-1(即0xFFFFFFFF),a^i相当于给各位取反,在-i则相当于+1,返回a的相反数; }
相关文章推荐
- VC++连MySQL中的一些小知识点
- [互联网面试笔试汇总C/C++-14] 判断一棵二叉树是否是二叉搜索树-微策略
- C++ 关键字typeid
- 单向链表的C++实现
- C语言中数据类型转换
- 仿迅雷播放器教程 -- C++界面制作方法的对比 (9)
- 1036[Crypto Columns]
- C/C++经典面试题
- [互联网面试笔试汇总C/C++-13] 写一个程序来判断机器的大小端-微策略
- C++ 编程常用问题
- 关于C语言宏定义#define的心得
- C++类的前置声明
- 如何为C++test产品添加绑定License
- 1024[MJ, Nowhere to Hide]
- C++ vector容器使用 排序
- c、c++排序函数qsort、stable_sort
- C++ list 成员函数
- C++与汇编的混合编程
- Parasoft C++test 快速安装指南
- 作业 1 熟悉C语言编程环境、练习代码录入