我是靠谱客的博主 爱听歌音响,最近开发中收集的这篇文章主要介绍【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 的个数。

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】位运算合集所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部