位运算技巧总结

常见位运算技巧 概述 在一些算法题中往往可以见到位运算的应用,计算机执行位运算时速度是极快的,熟练掌握一些位运算的技巧,有助于我们把程序写的更加简洁和巧妙。 一、得到某数中最低位的1 有时候,会需要取出某个数中最低位(最右边的位)的1作为标志位,如何快速的得到该位呢?假设我们此时要找的是数字k中最低位的1,有如下两种方法: 方法一 int flagBit = 1; while((k & flagBit) ... 阅读详情

        今天在Matrix67大牛的博客上看到了很多位运算的优化技巧,顿感位运算的神奇,现在来我总结一下位运算的神奇用法。

         下面是常见的位运算:

         

    a & b   a和b都是1的位取1,其他都取0。和&&有区别,&&是逻辑运算,返回true或者false
    a  |  b   a和b都是0的位取0,其余情况都取1。和||有区别,||是逻辑运算,返回true或者false
    a  ^ b   a和b相同的位取0,不同的位取1.
    ~a   a按位取反 一个无符号整形取反等于表示上限减去这个数, 比如12 假设是16位无符号整型,~12就是65535-12=65523
    a << b  a左移b位
    a >> b  a右移b位 

       

        下面是位运算的几种常见的用法:

       

    把a的末k位变成1           00110001 k=3 => 0110111      a | (1<<k - 1)
    把a的末k位取反         00110001 k=3 => 0110110      a ^ (1<<k -1)
    把a右边连续的1变成0      00110111 => 00110000    (a +1)&a
    把右边连续的0变成1        00101111 => 00100000    (a - 1)^a
    取右边连续的1                00101111 =>  1111            ((a+1) | a) >> 1
    去掉右起第一个1的左边   00101000 =>  x & (-x) 或者 x & (x ^ (x-1)) 这个在树状数组中会用到


        上面这些只是位运算的简单应用(已经非常强大了),还有一些更加强大的用处,第一个例子是,求一个32bit整数,求它的1的位数,代码如下:

       

    x := (x and $55555555) + ((x shr 1) and $55555555); 
    x := (x and $33333333) + ((x shr 2) and $33333333); 
    x := (x and $0F0F0F0F) + ((x shr 4) and $0F0F0F0F); 
    x := (x and $00FF00FF) + ((x shr 8) and $00FF00FF); 
    x := (x and $0000FFFF) + ((x shr 16) and $0000FFFF); 

 

        想一下怎么回事,比如x为21, 二进制为10101,把这个数代入代码中看下,

        第一步 : 10101 & 0101010101010101 + (1010)&0101010101  = 10101

        第二步 :10101&001100110011 + (101)&001100110011 = 10001+1 = 10010

        第三步:   10010&00001111 + 1&00001111 = 10+1= 11

        第四步:   11&11111111 + 0 = 11

        第五步:    11& 11111111 + 0 = 11
        

        上面五步得到了最终结果,答案为3,到这里,看出什么了吗?这段代码其实是用了分治的思想,我看了好久,这几个数字比较令人眼花。 下面让我来解释一下。比如这样一个数字,x32x31x30...x4x3x2x1 ,  第一步之后,变成了   x32x31两位表示x32和x31的和,x30x29表示x30和x29的和...以此类推。第二步之后,x32x31x30x29四位数字表示x32~x29的和,x28x27x26x25表示x28~x25四位数字的和,以此类推。第五步结束后x32~x1表示x32~x1这32位数字的和。如果你还是不清楚,请看下面这个图:

 

        如何只用位运算来求一个整数的绝对值呢? 一个正整数x和它的相反数-x的关系是,-x是x的补码,即-x=(~x)+1.x的绝对值代码为 x ^ (~(x >> 31) + 1) + x >> 31,当x为正数时,x>>31为0,取反变成-1,再加1变成0,0异或任何数不变;当x为负数时候,x>>31=1,1取反后加一变成0xFFFFFFFF,异或x之后,x每位取反,取反后再加一刚好是相反数。

       


          先写到这里,用到了再加

算法技巧-位运算(Bit Manipulation) 算法技巧-位运算(Bit Manipulation)一 . 位运算简介二 . 位运算规则A . AND与运算B . OR或运算C . XOR异或运算D . NOT取反运算E . 位移运算三 . 位运算技巧A . AND与运算技巧1 . 清零B . OR或运算技巧C . XOR异或运算技巧D . NOT取反运算技巧E . 位移运算技巧F . 综合运算技巧四 . 位运算例题五 . 位运算资料A . 关... 阅读详情

相关推荐

使用TypeScript的类型系统进行8位算术运算-JavaScript开发

ts-8位是一个实验库,可以在TypeScript的类型系统上执行8位算术运算。 它通过对长度为8(1字节)的元组应用按位运算,并利用TypeScript条件类型推断来给出结果。 该项目是用TypeScript编写的一个练习,并提供给可能会使用它的任何人。 TS-8位,使用TypeScript的类型系统执行8位算术导入{字节,数字,加,子,Mul,Div,Mod,Eq,Lt,Gt,Lte,Gte,Lsh,Rsh,And,Xor或,不是}从'./ts-8位'// //算术类型A = Num <加<字节<12>,字节<22>>> // +类型A = 34类型B = Num <子<字节<字节< 47>,字节<12>>> //-类型B = 35类型C = Num <字节<Mul>,字节<4>>> // // *类型C = 124类型D = Num <Div>,字节<8>>> // /类型D = 2类型E = Num <Mod>,字节<4>>> // //类型E

位运算整理

有关二进制的几个重点 1 二进制的最高位是符号位,0表示正数,1表示负数 2 正数的原码 反码 补码都一样 3 负数的反码 = 它的原码符号位不变,其它位取反 4 负数的补码 = 反码+1 5 0的补码和反码都是0 6 在计算机内部都是以补码的形式来运算的 7 偶数的二进制最后一位都为0,奇数的最后一位为1 1. &amp; 运算 1&amp;运算通常用于二进制取位操作...

我是传奇 365

主流算力卡性能对比分析

超大规模AI训练/HPC:优先选择NVIDIA H100或AMD MI300X,需关注显存带宽和多卡互联能力。企业级AI训练:NVIDIA A100性价比更高,生态成熟。国内自主可控需求:华为昇腾910B是首选,支持液冷和低功耗设计。本地AI推理/游戏:NVIDIA RTX 4090或RTX 5090性价比突出,但需注意显存容量限制。边缘计算/低功耗场景:华为昇腾310或清微智能TX536(能效比6.3TOPS/W@INT8)更合适。

m0_69867914的博客 7803

位运算介绍

雨巨那里听的课,记一波笔记;位运算理解容易但应用难,用好了可以大大简化代码,也会提供一种不错的思路。

qq_63211065的博客 2909

基于相位检测与锁相环的DIY超声波风速仪设计与实现

相位检测是信号处理中的一项基础技术,它通过测量两个周期信号之间的相位差来获取信息。其核心原理在于,当信号在介质中传播时,外部因素(如风速)会改变其传播速度,从而导致接收端信号的相位发生偏移。锁相环(PLL)是实现高精度相位检测的关键电路,它能动态调整本地振荡器的频率,以跟踪并锁定输入信号的相位,从而将微小的相位变化转换为易于测量的电压信号。这项技术的工程价值在于其对电路精度要求相对较低,鲁棒性好,非常适合低成本、高灵敏度的测量应用。在气象监测、工业传感和消费电子等领域,相位检测技术被广泛用于风速风向测量、位

weixin_29540599的博客 387

5分钟搞定!用FunASR在本地快速部署达摩院Paraformer语音识别模型

本文提供了一份快速部署指南,教你如何在5分钟内利用FunASR工具包在本地电脑上启动达摩院Paraformer语音识别模型。Paraformer作为一款非自回归端到端模型,以其推理速度快、识别精度高的特点,结合FunASR的一键式模型加载和统一API,让开发者能轻松构建本地语音识别系统,极大降低了前沿AI技术的应用门槛。

q9w8e7r6t5的博客 605

按位取反运算,简短精炼

概念: 补码:正数的补码就是原码,负数补码符号位不变,其余各位依次取反,最后末尾+1 反码:正数的反码是其本身,对于负数其符号位不变其它各位取反(0变1,1变0) 按位取反:所有位(符号位)都改变,0变1,1变0 二进制的补码表示和原码表示关系: 1.对于一个正数的原码表示,他的原码表示就是它的补码表示 2.对于一个负数的原码表示,他的原码表示和补码表示如下转换规则:

m0_74459304的博客 5669

单细胞测序数据读取实战指南:从入门到精通

本文提供了单细胞测序数据读取的实战指南,涵盖从标准10X Genomics格式到通用表达矩阵及RDS文件的读取方法。文章重点解析了数据读取的核心步骤、常见问题解决方案及进阶技巧,旨在帮助用户夯实数据分析基础,确保后续分析流程的准确性。

weixin_29095587的博客 460

位运算“骚操作”汇总(算法进阶)

交换a、b两个数的值(一般不建议使用) 2n、2n+1和n/22*n 等价于 n<<1 2*n+1等价于 n<<1|1 n/2 等价于 n>>1 N&((~N)+1) 这是个啥结果? 这个结果是,将二级制的N,其最右边一个为1的位保留成1,其他位全变成0的数。 ...

编程架构三分天下:分层、分治、分时序。 2053

S32K1XX调试--快速定位HardFault

1、背景 程序运行,发现程序跑飞到HardFault,但不清楚为什么会跑到HardFault中断处理函数去。 2、分析 要想知道为什么会跑到HardFault_Handler中去,就很有必要了解一下,程序上一条执行的是那条命令。 根据汇编指令可以定位上条指令,但如果对汇编指令不是很了解的话,那就很头疼了 根据单步运行也能实现定位,但如果程序量很大,又很杂,可能花费的时间就比较久些。 3、问题查找 提供一种不需要懂汇编指令的查找方法,方法如下: 在中断处理函数中插入以下代码,以及另外定义

ping_devil的博客 4019

ENSP内使用wireshark进行抓包,并且解析icmp报文

前四位:54 89 98 e8 20 38 为ip报文包的mac地址也就是物理地址。一开始进行抓包是没有icmp报文的,需要我们在ensp中使用pc1请求联通pc9。协议编号后分别为:ip版本、ip首部报文长度、服务类型、ip报文总长度。最后为校验和 、源ip地址、目的ip、从08 00开始为真正的数据。我们需要实验的端口为:0/0/4,也就是抓包第三个交换机内的报文。其中显示的icmp报文就是我们需要解析的ip报文。源mac地址后跟着的就是协议编号: 08 00。根据ip报文包的结构我们进行解析。

2301_81713278的博客 2139

算法思想总结:位运算

关于位运算的全部总结,看这篇就够了!!!

weixin_51142926的博客 2322

80、编程学习资源与x86知识全解析

本文详细介绍了编程学习中多个领域的优秀书籍和博客资源,涵盖逆向工程、C/C++、x86/x86-64架构、ARM、汇编语言、Java、UNIX、密码学等多个方向。同时,深入解析了x86架构的核心知识,包括术语、通用寄存器、FPU寄存器、SIMD寄存器、调试寄存器以及常用指令的使用方法和操作步骤。通过本文,读者可以系统地掌握底层编程知识,并应用于逆向工程、系统开发和性能优化等领域。

tree的博客 221

位运算及诸技巧

位运算及诸技巧 位运算概念:基于二进制的位的运算 对于位运算,注意两点: 1.必须以二进制角度进行位运算 2.必须以补码角度进行位运算 位运算符: (1)按位取反 ~ 求~1 具体过程 1的补码为: 0000 0000 0000 0000 0000 0000 0000 0001(补) 按位取反: 1111 1111 1111 1111 1111 1111 1111 1110(补) 变为原码: 1000 0000 0000 0000 0000 0000 0000 0010(原) 读数: -2 计算机验证 i

weixin_43696012的博客 612

innovus:如何在init design之后新增参考库(lib/lef)

如题,在PR过程中经常会遇到这种问题,时序无法收敛,需要新增一套lvt或者hpc的库,怎么办?

m0_61544122的博客 5010

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【位运算】位运算基础认识及其使用技巧

计算机底层运算时,都是二进制数据补码间的运算,也就是先将原码转成补码进行运算的,补码间进行运算,得到的也是补码,输出时就再将补码转换为原码(正数的补码就是原码). 位运算能够对整数在内存中的二进制位直接进行操作,因此在很多时候使用位运算能大大提高程序的性能.

T_158327的博客 1932

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

位运算中的技巧

位运算知道了就会用了吗?快来看看这些技巧,让你处理问题的时候如虎添翼。还在等什么,快点进来看看。

Sdom_L的博客 1917

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

位运算技巧

位运算符 按位与& : 0 & 0 = 0 0 & 1 = 0 1 & 1 = 1 按位或| : 0 | 0 = 0 0 | 1 = 1 1 | 1 = 1 按位异或 ^ : 0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 1 = 0 1 ^ 0 = 1 左移 << : 左移一位相当于乘上2 (左移补0) 右移>> : 右移一位相当于除...

恁村扛把子的博客 316

位运算的应用与技巧:

位运算的应用: 程序中的所有数在计算机内存中都是以二进制的形式储存的。所谓位运算,就是直接对整数在内存中的二进制位进行操作,一般解题时都用一个十进制整数来代表某个集合。 基本的位运算操作: &(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。 其中,按位取反运算符是单目运算符,其余均为双目运算符。 位运算符的优先级从高到低,依次为~、&、^、|, 其中~的结合方

我的ACM,我的梦!!! 3707

位运算应用与技巧

(4)、使用位运算关键是理解每一个运算的特点,灵活运用它们的性质,并且找到问题与位之间的联系,其实上面的几个枚举集合的技巧都是根据位之间的联系然后运用相应的运算符得出的,一些位运算符也有一些非常重要的特点,比如说异或运算具有交换律,结合律,自反性等等。把右数第k位变成1 |(101001->101101,k=3) | x | (1<< (k-1))把末k位变成1 |(101001->101111,k=4) | x | ((1<< k)-1)

smartDMer的专栏 309

《位运算技巧以及Leetcode的一些位运算题目》

技巧 位运算的一些基础技巧: x ^ 0... = x x ^ 1... = ~x x ^ x = 0 x & 0... = 0 x & 1... = x x & x = x x | 0... = x x | 1... = 1... x | x = x 进阶技巧: n & (n-1) 可以去除n的位级表示中最低的一位: 如 n = 11110100 , n - 1 = 11110011 n & (n-1) = 11110000 n & (-

hanhan的博客 1833

探究位运算编程技巧

位运算是一种非常强大的工具,它能提供比普通算术运算更快的解决方案。了解和掌握位运算的技巧,可以帮助程序员写出更加高效和优雅的代码。通过上述介绍和示例,相信我们对位运算有了更深入的理解。实际编程中,这些技巧能极大地提高数据处理的效率和性能。

十年运维开发经验的王义杰在此分享自己的知识和经验 1003

Java位运算技巧

位运算作为底层的基本运算操作,往往是和'高效'二字沾边,适当的运用位运算来优化系统的核心代码,会让你的代码变得十分的精妙。以下是我所遇之的一些简单的位运算技巧作为博文记录。 1.获得int型最大值 public static void main(String[] args) { int maxInt = (1 << 31) - 1; ...

lilee 3457
上一篇: Standford 机器学习应用的建议及机器学习系统的设计
下一篇: 最小操作数
Jackie_Zhu
博客等级 码龄18年 343粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值