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

数据结构-位运算总结

位运算总结:

1.求位1的个数

191. 位1的个数 - 力扣(LeetCode)

有两种写法:

1.是把该数不断的去与0x1相与,得到该数的最后一位的值,然后判断他是不是1,再把该数更新一下整体往后移动一位也就是右移一位。

class Solution {
public:int hammingWeight(int n) {int res = 0;while(n){if(n&0x1)   res++;n = n>>1;}return res;}
};

2.如下有两个重要点:

  • 当一个数被减1时,它最右边的那个值为1的bit将变为0,同时其右边的所有的bit都会变成1。
  • 每次执行x&(x-1)的作用是把ⅹ对应的二进制数中的最后一位1去掉。因此,循环执行这个操作直到ⅹ等于0的时候,循环的次数就是x对应的二进制数中1的个数。

举例分析:9的二进制表示为1001,8的二进制表示为1000,两者执行&操作之后结果为1000,此时1000再与0111(7的二进制位)执行&操作之后结果为0,得到最终1的个数为0。

class Solution {
public:int hammingWeight(int n) {int res = 0;while(n){res++;n = n&(n-1);}return res;}
};
2.求二进制中0的个数

就是一直在数后面加1,直到这个数他越界等于-1就行了。循环在 n + 1 不为 0 时继续执行。这意味着一旦 n 变为 -1(即 1111 1111 1111 1111 1111 1111 1111 1111),n+1 就会等于 0,循环退出。

class Solution {
public:int CountZeroBit(int n) {int res = 0;while(n+1){res++;n |= (n+1);}return res;}
};

核心操作n |= (n + 1):按位或操作将 nn+1 进行或操作,这实际上是将 n 二进制表示中最低位的 0 变为 1。这是因为 n+1 会将最低的 0 位置为 1,而所有更低位的 1 位置为 0,所以与 n 进行或操作后,会将 n 中最低的 0 位置为 1

3.二进制求和

67. 二进制求和 - 力扣(LeetCode)

模拟,逢二进一,先反转数字,从尾巴开始遍历,然后两对应数字逢二进一,我们提前设置一个carry变量用来存储之前的数据给本位的进位,然后加上本位的数据,在判断本位的数据是否有大于2的然后考虑是否进位,最后再判断最后一个数据是否是有进位,如果有在插入一个,没有的话就反转,输出就行。

class Solution {
public:string addBinary(string a, string b) {string res;reverse(a.begin(),a.end());reverse(b.begin(),b.end());int  n = max(a.size(),b.size());int carry = 0;for(int i=0;i<n;i++){carry+= i<a.size()?(a.at(i)=='1') : 0;carry+= i<b.size()?(b.at(i)=='1') : 0;res.push_back((carry%2)? '1':'0');carry /= 2;}if(carry){res.push_back('1');}reverse(res.begin(),res.end());return res;}
};
4.颠倒二进制位

190. 颠倒二进制位 - 力扣(LeetCode)

n 视作一个长为 32 的二进制串,从低位往高位枚举 n 的每一位,将其倒序添加到翻转结果 rev

class Solution {
public:uint32_t reverseBits(uint32_t n) {uint32_t rev = 0;for (int i = 0; i < 32 && n > 0; ++i) {rev |= (n & 1) << (31 - i);n >>= 1;}return rev;}
};
http://www.lryc.cn/news/420620.html

相关文章:

  • java 异常堆栈的由来
  • 【推荐系统】【多任务学习】Progressive Layered Extraction (PLE)
  • java -转win32/win64免安装jre环境运行
  • 算法板子:容斥原理——求出 1∼n 中能被质数 p1,p2,…,pm 中的至少一个数整除的整数有多少个
  • 用gurobipy求解带不等式约束条件的优化问题
  • 漏洞复现-Adobe ColdFusion 远程代码执行漏洞(CVE-2023-38203)
  • Spring-MyBatis整合:No qualifying bean of type ‘XXX‘ available: ...
  • gitea docker 快捷安装部署
  • CLAMP-1
  • Blender的Python编程介绍
  • 树莓派4/5:运行Yolov5n模型(文末附镜像文件)
  • 【学习笔记】Day 9
  • Linux网络案例
  • 苹果离线打包机配置和打包
  • 【C++ Primer Plus】学习笔记 5【指针 下】
  • Phpstorm实现本地SSH开发远程机器(或虚拟机)项目
  • API 的多分支管理,让 Apifox 帮你轻松搞定!
  • 线上预约陪诊平台医院陪诊系统源码就医陪护小程序APP开发
  • 240806-在Linux/RHEL开机中自动启动bash脚本
  • 【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
  • 31_逻辑漏洞、水平垂直越权、垂直越权漏洞测试、水平越权
  • css写一个按钮流光动画效果
  • AxMath保姆级安装教程(word联用)及使用TIPS
  • Vue-03.指令-v-on
  • 接口基础知识6:详解http request body(一篇讲完常见请求体)
  • Windows Server 安装Web,DHCP,DNS,FTP四大服务及其配置和监控方式
  • 创意指南丨VR游览沉浸式空间体验
  • 【iOS】—— autoreleasePool以及总结
  • 培训第二十五天(python中执行mysql操作并将python脚本共享)
  • LVS实战项目