概述
目录
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 的个数。
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 的个数。
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 的个数。
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 的幂次方。
bool PowerToTwo(int value) {
return value <= 0 ? false : (0 == (value & (value - 1));
}
3. 统计二进制位中不同的位数
首先按位异或得到二进制位中为1的位bitnum(ps:不同为1),然后利用bitnum & (bitnum - 1)就可以得到1的个数count,此时的count就是二进制位中不同的位数。
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】位运算合集所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复