当前位置: 首页 > article >正文

求二进制最低位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;
}

http://www.kler.cn/news/109030.html

相关文章:

  • Python-easygui
  • 开发库介绍
  • 链游风暴再起?MBOX即将再度起飞
  • O(1) 时间插入、删除和获取随机元素
  • 你会处理 go 中的 nil 吗
  • ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践
  • 38基于matlab的期货预测,利用PSO优化SVM和未优化的SVM进行对比,得到实际输出和期望输出结果。
  • 万字解析设计模式之单例模式
  • 为wget命令设置代理
  • 利用 JSqlParser 防止 SQL 注入
  • String、StringBuffer、StringBuilder和StringJoiner
  • prometheus服务发现
  • 松下A6B伺服 马达不动问题解决
  • Photoshop(PS)2021版 安装教程(图文教程超详细)
  • git建仓库小记
  • C#__简单了解XML文档
  • 谈谈我对 Reacitive 方法的理解
  • Java开发中方法命名规范
  • NCCL后端
  • 面试测试工程师一般问什么问题?
  • 【Java】选择语句、循环语句
  • Mybatisplus 常用注解
  • Elasticsearch跨集群检索配置
  • Linux C/C++ 实现网络流量分析(性能工具)
  • 海外问卷调查是怎么做的?全方位介绍!
  • 【Git】HEAD detached from xxx 问题及解决方案
  • Hive创建分区表并插入数据
  • bat文件学习
  • 基于STM32的示波器信号发生器设计
  • LeetCode 917 仅仅反转字母 简单