详细解读C++中的位运算总结

简介: 详细解读C++中的位运算总结

C++中的位运算总结

1)位运算

位运算是指对转换成二进制的数字进行每一位上的0、1的运算,运算涉及到五种运算:与(),或(|),异或(^),左移([),右移(])。

如下表所示:

与()

0 0 =0

1 0 = 0

0 1 = 1

1 1 = 1

或(|)

0 | 0 = 0

1 | 0 = 1

0 | 1 = 1

1 | 1 = 1

异或(^)

0 ^ 0 = 0

1 ^ 0 = 1

0 ^ 1 = 1

1 ^ 1 =0

左移([)

0001 1001 [ 2 = 0110 0100

1000 1010 [ 3 = 0101 0000

右移(])

0000 1010 ] 2 = 0000 0010

1000 1010 ] 3 = 1111 0001

左移:

左移运算符m [ n表示把m左移n位。在左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。

右移:

右移运算符m ] n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但是与左移不一样的是,右移时候的最左边的n位处理:如果数字是一个无符号数值,则用0填补最左边的n位;如果数字是一个有符号数值,则用数字的符号位填补最左边的n位,如上表中的:1000 1010 ] 3 = 1111 0001。

这五种运算符都是双目操作符,另有一种单目操作符~,表示取反。即:~1 = 0,~0 = 1。

位运算符只能用于整型数据,对于其它类型的数据进行位操作编译器会报错。

位运算符的优先级比较低,因此应尽量使用括号来保证运算顺序。

2.位运算符的常用技巧

1)判断奇偶

只要根据最末位是0还是1即可判断整数的奇偶性。例如整数n,可以用if((n 1) == 0)来判断,要比if(n % 2 == 0)判断奇偶性效率高。

2)交换数据

void swap(int a, int b)

{

if (a != b)

{

a ^= b;//a=(a^b);

b ^= a;//^运算满足交换律,b^(a^b)=b^b^a

a ^= b;//a=(a^b)^a

}//代码效果参考:http://www.ezhiqi.com/zx/art_7060.html

}//代码效果参考:http://www.ezhiqi.com/bx/art_4493.html

由于一个数和自己异或的结果为0,并且任何数与0异或都会不变的,所以第二步中b ^= a就等价于b = b ^ b ^ a = a,即b被赋上了a的值。

3)变换符号

正整数变成负整数,负整数变成正整数,只需将原数的二进制取反后加1即可。例如:

对于-11和11,可以通过下面的变换方法将-11变成11

1111 0101(二进制) 取反-> 0000 1010(二进制) 加1-> 0000 1011(二进制)

同样可以这样的将11变成-11

0000 1011(二进制) 取反-> 0000 0100(二进制) 加1-> 1111 0101(二进制)

3.位运算应用

1)高低位互换

给出一个16位的无符号整数。称这个二进制数的前8位为“高位”,后8位为“低位”。现在写一程序将它的高低位交换。例如,数34520用二进制表示为:

10000110 11011000

将它的高低位进行交换,我们得到了一个新的二进制数:

11011000 10000110

它即是十进制的55430。

这个问题用位操作解决起来非常方便,设x=34520=10000110 11011000(二进制) 由于x为无符号数,右移时会执行逻辑右移即高位补0,因此x右移8位将得到00000000 10000110。而x左移8位将得到11011000 00000000。可以发现只要将x]8与x[8这两个数相或就可以得到1101100010000110。

2)判断一个整数是不是2的整数次方

如果一个整数是2的整数次方,那么它的二进制标识中一定有且只有一位是1,而其他所有位均为0.

转载连接:

linux下的docker操作命令及异常

相关文章
|
4月前
|
算法 C++
c++算法学习笔记 (10) 位运算
c++算法学习笔记 (10) 位运算
|
4月前
|
算法 测试技术 C++
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
|
4月前
|
存储 算法 数据安全/隐私保护
C++ 位运算 std::bitset类的使用介绍
C++ 位运算 std::bitset类的使用介绍
110 0
|
4月前
|
算法 测试技术 C#
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
|
11月前
|
算法 C++
剑指offer(C++)-JZ56:数组中只出现一次的两个数字(算法-位运算)
剑指offer(C++)-JZ56:数组中只出现一次的两个数字(算法-位运算)
剑指offer(C++)-JZ56:数组中只出现一次的两个数字(算法-位运算)
|
11月前
|
机器学习/深度学习 算法 C++
剑指offer(C++)-JZ64:求1+2+3+...+n(算法-位运算)
剑指offer(C++)-JZ64:求1+2+3+...+n(算法-位运算)
|
11月前
|
算法 C++
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
|
11月前
|
算法 C++
剑指offer(C++)-JZ15:二进制中1的个数(算法-位运算)
剑指offer(C++)-JZ15:二进制中1的个数(算法-位运算)
|
11月前
|
算法 C++
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
剑指offer(C++)-JZ65:不用加减乘除做加法(算法-位运算)
|
存储 C语言 C++
【C++知识点】位运算
【C++知识点】位运算
134 0