笔试中常见的位运算案例分析
2015-07-25 22:18
260 查看
参考博文 : /article/1392192.html
输入一个数字,然后计算出它二进制中'1'的个数。此方法相对于使用自带的String库,把空间节约到了O(1)。
获取x中0到16位的低位值
获取16~32位的值
求相反数 // 取反+1
求绝对值
证明 :
先移位来取符号位,int i = a >> 31;要注意如果a为正数,i等于0,为负数,i等于-1。然后对i进行判断——如果i等于0,直接返回。否之,返回~a+1。
或者 因为 x >>31 只可能我0或-1 可能你会觉得-1右移31不会是1吗,怎么变成了-1了,因为负数右移的时候,左边填充的不是0而是1!!
1. 与0相异或,不变 如果x是正数的话,不变
2. 与-1(oxffff) 相异或,相当于取反,以为为1的地方变成了0,为0的地方变成了1 ,然后+1
交换
证明:
第一步 a^=b 即a=(a^b);
第二步 b^=a 即b=b^(a^b),由于^运算满足交换律,b^(a^b)=b^b^a。由于一个数和自己异或的结果为0并且任何数与0异或都会不变的,所以此时b被赋上了a的值。
第三步 a^=b 就是a=a^b,由于前面二步可知a=(a^b),b=a,所以a=a^b即a=(a^b)^a。故a会被赋上b的值。
输入一个数字,然后计算出它二进制中'1'的个数。此方法相对于使用自带的String库,把空间节约到了O(1)。
static int bitCount(int n) { int count = 0; while (n != 0) { count += (n & 1); n >>= 1; } return count; }
获取x中0到16位的低位值
x = x & 0xffff;
获取16~32位的值
x = (x >> 16 ) & 0xffff;
求相反数 // 取反+1
i = (i ^ -1) + 1;
求绝对值
证明 :
先移位来取符号位,int i = a >> 31;要注意如果a为正数,i等于0,为负数,i等于-1。然后对i进行判断——如果i等于0,直接返回。否之,返回~a+1。
//by MoreWindows( http://blog.csdn.net/MoreWindows ) int my_abs(int a) { int i = a >> 31; return i == 0 ? a : (~a + 1); }
或者 因为 x >>31 只可能我0或-1 可能你会觉得-1右移31不会是1吗,怎么变成了-1了,因为负数右移的时候,左边填充的不是0而是1!!
1. 与0相异或,不变 如果x是正数的话,不变
2. 与-1(oxffff) 相异或,相当于取反,以为为1的地方变成了0,为0的地方变成了1 ,然后+1
i = (x ^ (x >> 31)) - (x >> 31);
交换
void swap(int a,int b){ a = a^b; b = a^b; a = a^b; }
证明:
第一步 a^=b 即a=(a^b);
第二步 b^=a 即b=b^(a^b),由于^运算满足交换律,b^(a^b)=b^b^a。由于一个数和自己异或的结果为0并且任何数与0异或都会不变的,所以此时b被赋上了a的值。
第三步 a^=b 就是a=a^b,由于前面二步可知a=(a^b),b=a,所以a=a^b即a=(a^b)^a。故a会被赋上b的值。
相关文章推荐
- 与结构体对齐有关的 分析内存分配的笔试题
- Java基本数据类型 及 位操作
- Wildcard Matching
- PipeLine and Value
- leetcode Stock买 and 卖
- 接收的到的Socket请求怎么转换成servletRequest
- Tomcat接收请求
- 关于连续子数组的最大和和最大积
- Decode Ways
- Ubuntu apt-get install错误:unmet dependencies
- iOS OC NSNumber转为BOOL
- checkedListBox
- Java笔记
- Scala高阶编程指南
- Android —— 自定义View的实现方法
- 正则表达式的应用(持续更新ing)
- Tomcat整体架构分析
- Unique Paths
- Climbing Stairs
- Tomcat源码阅读计划