我是靠谱客的博主 爱听歌音响,这篇文章主要介绍【C】位运算合集,现在分享给大家,希望可以做个参考。

目录

1. 计算二进制位中 1 的个数

1.1 模 2 除 2

1.2 右移与 1

1.3 减 1 相与

2. 判断一个数字是否是 2 的幂次方

3. 统计二进制位中不同的位数

4. 其他位运算


1. 计算二进制位中 1 的个数

1.1 模 2 除 2

首先 num 对 2 取余,假如得到的值为 1,那么计数器 count 加 1,接着除以 2(或者右移一位),反复执行此操作,直到 num 为 0,最后得到的 count 就是二进制中 1 的个数。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int count_one_bits(unsigned int value) { int count = 0; while (value) { if (1 == (value % 2)) { ++count; } //value /= 2; value >>= 1; } return count; }

1.2 右移与 1

首先每个二进制数字按位与 1 都可以得到它的最右边的数字,然后不断地右移,直到该数字的最高位也右移到最低位,如果按位与 1 得到的值为 1,那么计数器 count 加 1,最后得到的 count 的值就是二进制中 1 的个数。

复制代码
1
2
3
4
5
6
7
8
9
10
11
int count_one_bits(unsigned int value) { int count = 0, i = 0; for (; i < 32; i++) { if (1 == ((valye >> i) & 0x1)) { ++count; } } return count; }

1.3 减 1 相与

num & (num - 1) ,由于这两个数字相差 1,那么每次按位与的过程中,总能够将最低位的 1消去,(ps:二进制位是 逢 2 进 1 的,那么两个数字相差 1,最低位必然是一个 1 和一个 0),计数器加 1,重复此操作,直到该数为 0,则计数器 count 的值就是二进制位中 1 的个数。

复制代码
1
2
3
4
5
6
7
8
9
10
int count_one_bits(unsigned int value) { int count = 0; while (value) { value = value & (value - 1); ++count; } return count; }

2. 判断一个数字是否是 2 的幂次方

num & (num - 1) 的值等于 0 时该数字就是 2 的幂次方。

复制代码
1
2
3
bool PowerToTwo(int value) { return value <= 0 ? false : (0 == (value & (value - 1)); }

3. 统计二进制位中不同的位数

首先按位异或得到二进制位中为1的位bitnum(ps:不同为1),然后利用bitnum & (bitnum - 1)就可以得到1的个数count,此时的count就是二进制位中不同的位数。

复制代码
1
2
3
4
5
6
7
8
9
10
11
int DifferentBits(int value1, int value2) { int count = 0; int bitnum = value1 ^ value2; while (bitnum) { bitnum = bitnum & (bitnum - 1); ++count; } return count; }

4. 其他位运算

 交换一个数字的奇数位和偶数位https://blog.csdn.net/sustzc/article/details/79912156
 通过位运算求两个数字的平均值https://blog.csdn.net/sustzc/article/details/79615022
找出一组数据中单独出现的两个数字https://blog.csdn.net/sustzc/article/details/80048889

最后

以上就是爱听歌音响最近收集整理的关于【C】位运算合集的全部内容,更多相关【C】位运算合集内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(86)

评论列表共有 0 条评论

立即
投稿
返回
顶部