【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. 其他位运算

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值