求二进制最低位1和最高位1的方法,以及反转二进制,复杂度O(1)

本文主要对三个二进制操作算法进行介绍,它们都是O(1)的。相对于暴力移位去计算,效率会高很多。这三个算法分别是 获取最低的1的比特位、获取最高1的比特位,反转二进制。

(1) 获取最小的1位

法1

int lowbit(int x){
	return x & -x;  // 自已思考下哈,很容易理解
}

举个例子,例如x=1256, 则:

 x:    00000000000000000000010011101000
-x:    11111111111111111111101100011000
x&-x   00000000000000000000000000001000

法2

int lowbit(int x){
	return (x & (x-1)) ^ x;
}

(2) 获取最高的1位

法1

int higbit(int x){
	return reverse(lowbits(reverse(x)));
}

reverse() 函数的作用反转二进制位,复杂度也是O(1), 在后面介绍

法2

引用这篇文章的方法:https://blog.csdn.net/qq_41709801/article/details/88371152
原理是把最高位的1扩散到之后的每一位

unsigned hight_bit(unsigned x){//0010 1100 0000 0000 0000 0000 0000 0000 0000 0001
	x= x|(x>>1);              //0011 1110 0000 0000 0000 0000 0000 0000 0000 0000
	x= x|(x>>2);              //0011 1111 1000 0000 0000 0000 0000 0000 0000 0000
	x= x|(x>>4);              //0011 1111 1111 1000 0000 0000 0000 0000 0000 0000
	x= x|(x>>8);              //0011 1111 1111 1111 1111 1000 0000 0000 0000 0000
	x= x|(x>>16);             //0011 1111 1111 1111 1111 1111 1111 1111 1111 1111
	x= x|(x>>32);
	// 如果数特别大, 这里感觉会溢出, 所以这里只使用于小于数据最大值1/2的数。
	return (x+1) >> 1;        //0100 0000 0000 0000 0000 0000 0000 0000 0000 0000
}

反转二进制数

使用递归的方式

int reverse(int x){
	x = ((x >> 1)  & 0x55555555) | ((x & 0x55555555) << 1);
	x = ((x >> 2)  & 0x33333333) | ((x & 0x33333333) << 2);
	x = ((x >> 4)  & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4);
	x = ((x >> 8)  & 0x00ff00ff) | ((x & 0x00ff00ff) << 8);
	x = ((x >> 16) & 0x0000ffff) | ((x & 0x0000ffff) << 16);
	return x;
}
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值