现在的位置: 首页 > 综合 > 正文

位运算相关!

2013年08月18日 ⁄ 综合 ⁄ 共 1303字 ⁄ 字号 评论关闭

& 相应二进制位都为1,结果值为1,否则为0
| 相应二进制位只要有一个为1,结果值为1
^ 异或 相应二进制位值相同则为0,否则为1
~ 取反 相应二进制位取反,即将0变1,将1变0
<< 左移 各二进制位左移N位,右补0    (实际上是 *2的N次方)
>> 右移 各二进制位右移N位,无符号数, 高位补0 (实际是 /2的N次方)

  
====================================================================

1.~x+1=-x , ~(x-1)=-x ;  负值=正值取反再加一

  x & ~(x - 1))   ;     x & (-x)    ;   x & ~x+1  ; 相同意思的三个表达,代表: 保留数字x的二进制表示中的最后一位1,

  而把其他所有位都变成0. 例如:

            24 的二进制为:  11000  

            24&(-24) 的二进制为: 1000 ,即为10进制的8; 与第4点的 findFirstOne 函数不同,特别注意了. findFirstOne(24)=3.

int lowbit(int x) {  //保留数字x的二进制表示中最后一位1,其他所有位清0
	return x & ~(x - 1);
}

====================================================================

2.x&(x-1)把x二进制表示的最右边一个1变成0

将x转化为2进制,看含有的1的个数

int funcB(int x) {
	int countx = 0;
	while (x) {
		countx++;
		x = x & (x - 1);
	}
	return countx;
}

-------------------------------------
②判断一个数(x)是否是2的n次方

int funcA(int x) {
	return ((x & (x - 1)) == 0);
}

====================================================================

3.交换算法: 

void swap(int& a, int& b) {
	a ^= b;
	b ^= a;
	a ^= b;
}

====================================================================

4. 测试从右边数第pos个位是否为1:

int findFirstBit1(int value) {     //二进制中从右边数首个为1的位置(有多少个0)
	int pos = 0;
	if (value != 0)
		while ((value & 1) != 1 && (pos < 32)) {
			value = value >> 1;
			pos++;
		}
	return pos;
}
bool isBit1(int value, int pos) {  //测从右边数pos位是否为1
	return ((value >> pos) & 1);
}

=======================================================================================

5. (n&-m)表达式的意义:取不大于n的最大的m的倍数,正负都通用. 其中m 为2的x次幂.

抱歉!评论已关闭.