首页 > 其他分享 >位运算

位运算

时间:2024-01-27 10:44:10浏览次数:12  
标签:运算 二进制 lowbit 取反 异或 要取 operatorname

取出整数 \(n\) 在二进制下的最后一位:

直接说结论:n & 1。这一点可以用来判奇偶性,也是其它二进制操作中很重要的一点。

取出整数 \(n\) 在二进制下的第 \(k\) 位:

注:二进制位从 \(0\) 开始计。

因为我们要取第 \(k\) 位,所以 \(0 \sim k - 1\) 位不用考虑,直接右移 \(k\) 位。

此时 \(n\) 末尾即为第 \(k\) 位,要取它,只需要取 \(n\) 的最后一位即可,所以是 (n >> k) & 1

把 \(n\) 的第 \(k\) 位取反:

谈到取反,不难想到异或。任何位异或 \(0\) 不变,异或 \(1\) 取反,所以即为 n ^ (1 << k)

把 \(n\) 的第 \(k\) 位变为 \(1\):

不难发现,把上述方法的异或改成或即可,即 n | (1 << k)

把 \(n\) 的第 \(k\) 位变为 \(1\):

把任意位变为零很容易想到与。其它位都与上 \(1\),第 \(k\) 位与上 \(0\),所以是 \(n & (~(1 << k))\)。

\(\operatorname{lowbit}\) 函数:

\(\operatorname{lowbit}(n)\) 的意思是,设 \(n\) 最低位为 \(k\),那么 \(\operatorname{lowbit}(n) = 2 ^ k\)。

如何推导 \(\operatorname{lowbit}\) 函数的公式呢?首先,第 \(k\) 位后所有的数肯定都是 \(0\),那么将 \(n\) 取反后,末尾的所有数都会变成 \(1\),第 \(k\) 位会变成 \(0\)。那么将 \(n\) 取反后再加 \(1\),第 \(k\) 位后所有的数又会变成 \(0\),第 \(k\) 位又会变成 \(1\),其它位都全部取反。这时将现在的 \(n\) 和原来的 \(n\) 按位与,就只会保留第 \(k\) 位和后面的 \(0\),这就是我们想要的 \(\operatorname{lowbit}(n)\)。而这里所说的 现在的\(n\),就是在计算机反码下的 \(-n\)。所以答案为 lowbit(n) = n & (-n)

\(\operatorname{popcount}\) 函数:

\(\operatorname{popcount}(n)\) 是 \(n\) 在二进制下有多少个 \(1\) ,方法即为每次将 \(n\) 减去 \(\operatorname{lowbit}(n)\),在将答案加 \(1\)。

标签:运算,二进制,lowbit,取反,异或,要取,operatorname
From: https://www.cnblogs.com/5002-qwq/p/17991180

相关文章

  • 位运算在算法中的应用
    快速幂问题:给定整数\(a,\b,\p\)计算\(a^b\modp\)\((1\lea,b,p\le10^9)\)分析:我们可以将\(b\)转换成二进制:\[b=c_02^0+c_12^1+c_22^2+...+c_{k-1}2^{k-1}\]其中\(c_n\)的取值为\(0\)或者\(1\)那么有:\[a^b=a^{c_02^0+c_12^1+c_22^2+...+c_{k-1}2^{k-1......
  • [office] 将模拟运算表转换为图表
    如果需要更加直观地查看和比较数据,还可以将计算结果转换为图表,下面就将双变量模拟运算表转换为图表,将模拟运算表转换为图表操作方法如下:1、在工作表Sheet6中对表格进行美化。选择单元格B2,按下Delete键,将计算结果清除。图12、选择单元格区域A2:E8,切换到【插入】选......
  • 计算机进行小数运算出错
    一、计算机小数运算错误示例:将0.1累加100次也得不到10下图是将0.1累加100次,然后将结果输出到显示器上的C语言程序:二、二进制表示小数小数点前面部分的转换只需将各数位数值和位权相乘,然后再将相乘的结果相加即可;小数点后面的部分将各数位的数值和位权相乘的结果相加即可。(位权......
  • 被Null条件运算符摆了一道
    C#6.0引入了Null条件运算符:obj?.Invoke();等价于if(obj!=null)obj.Invoke();即遇到null时短路。于是,我不假思索地写下了这样的代码:①awaitobj?.InvokeAsync();遇到null时短路嘛,我以为是等价于这样:②if(obj!=null)awaitobj.InvokeAsync(); 于是乎,......
  • 运算符的关系简览
     C/C++运算符优先级 优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右--()圆括号(表达式)/函数名(形参表)--.成员选择(对象)对象.成员名--->成员选择(指针)对象指......
  • C++教程——初识C++(运算符)
    前一节我们初步认识出c++是一门面向对象的程序设计语言,并且我们初步认识了变量,数据类型,常量,输入输出以及合法的标识符命名规则,接下来我们要学习的是运算符。在c++中有逻辑运算符,赋值运算符,算数运算符,位运算符,关系运算符和杂项运算符。先从简单的算数运算符开始讲起,算数运算符简单来......
  • 【每日GIS算法】(1)二维矢量的运算
    二维向量的基础运算主要有以下几种矢量的加法矢量的减法矢量的乘法矢量的除法矢量的模矢量的点乘矢量的叉乘矢量的归一化针对不同的场景,我们为二维矢量类提供对应的实例方法,但是由于这些实例方法会修改对象内部的数值,因此还提供对应的静态方法,在不改变原来的向量的情况......
  • JS中的扩展运算符(...)和剩余运算符(...)
    一、概念在JS中,扩展运算符(spread)是三个点 (...) ,剩余运算符(rest)也是三个点 (...)二、扩展运算符(1)基本使用:扩展运算符的主要作用是将一个数组转为用逗号分隔的参数序列,它好比rest的逆运算//传递数据代替多个字符串的形式functiontest(a,b,c){console.log(a);//1......
  • (19)Powershell字符串合并运算符
    (19)Powershell字符串合并运算符Powershell提供了对字符串的合并运算符,连接运算符-join将一组字符串连接成单个字符串,子字符串按其在命令中出现的顺序添加到生成的字符串中。连接运算符Powershell中字符串的连接运算符的语法如下:-Join<String[]><String[]>-Join参数......
  • (18)Powershell中的字符串拆分运算符
    (18)Powershell中的字符串拆分运算符Powershell中提供了对字符串的拆分操作运算符。-split运算符将一个字符串拆分成多个字符串。拆分运算符拆分运算符用于将一个或多个字符串拆分为多个子字符串。可更改拆分操作的以下元素:(1)定界符。默认为空白,但是可指定字符、字符串、模......