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

news/2024/10/18 18:23:28/

本文主要对三个二进制操作算法进行介绍,它们都是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 0001x= x|(x>>1);              //0011 1110 0000 0000 0000 0000 0000 0000 0000 0000x= x|(x>>2);              //0011 1111 1000 0000 0000 0000 0000 0000 0000 0000x= x|(x>>4);              //0011 1111 1111 1000 0000 0000 0000 0000 0000 0000x= x|(x>>8);              //0011 1111 1111 1111 1111 1000 0000 0000 0000 0000x= x|(x>>16);             //0011 1111 1111 1111 1111 1111 1111 1111 1111 1111x= 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.ppmy.cn/news/1185602.html

相关文章

用过的三种常用步进电机驱动电路

一、DRV8255 电流调节需要调整电位器&#xff0c;输入PWM、方向及使能信号即可控制&#xff0c;价格相对比较便宜 二、TB6600 调整细分数及电流即可驱动&#xff0c;驱动电流较大&#xff0c;接口电路光耦隔离 三、TMC2660 相对成本较高&#xff0c;可实现半流锁止、半流启动…

【递归、搜索与回溯算法】第七节.257. 二叉树的所有路径和46. 全排列

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;递归、搜索与回溯算法 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&am…

不定长顺序表2

接下来我们看怎么完成不定长顺序表的代码实现 这里先加一个头文件&#xff0c;名字叫dsqlist.h&#xff0c;存放不定长顺序表的函数定义与声明 然后建立一个名字叫dsqlist.cpp的源文件&#xff0c;跟其头文件配对成一对&#xff0c;(也可以叫别的名字不配对&#xff09;&…

基于vue小红书平台用户数据分析与可视化

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

技术分享| anyRTC低延时直播优化

直播系统就是把活动现场的音频或视频信号经数字压缩后&#xff0c;传送到直播多媒体服务器(CDN)上&#xff0c;在互联网上供广大网友或授权特定人群收听或收看。而随着技术的日益更新&#xff0c;人民对于直播的互动性&#xff0c;实时性要求更高了&#xff0c;传统的直播少则几…

力扣第738题 单调递增的数字 c++ 暴力超时 贪心优化

题目 738. 单调递增的数字 中等 相关标签 贪心 数学 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 1…

LCR 021. 删除链表的倒数第 N 个结点

这篇也是凑数的 .... 描述 : 给定一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点 题目 : LeetCode 删除链表的倒数第Nge节点 : LCR 021. 删除链表的倒数第 N 个结点 分析 : 首先创建一个虚拟节点(哨兵节点) , 虚拟节点下一节点指向头节…

git建仓库小记

git建仓库小记 1.新建远端git仓库2.新建本地仓库3.添加ssh key4.将本地仓库关联到远端5.push & pull 每次新建git项目的时候都要翻翻之前收藏的几篇帖子&#xff0c;索性自己汇总一下记录&#xff0c;以后一次粘贴搞定。 1.新建远端git仓库 这个比较简单&#xff0c;网页…