首页 > 其他分享 >位运算

位运算

时间:2024-02-06 18:33:27浏览次数:22  
标签:13 运算 结果 二进制 异或 按位

对二进制中的每一位进行逻辑操作,而不考虑整个数的数值大小
与位运算有关的特殊数据结构如[[树状数组]]或[[01线性基]]
一般对正整数进行运算

几种位运算

按位与AND &

只有两个位都为1时,结果才为1,否则为0。
两个数字做与运算,结果不会变大。
做如下变换:

1 0 0 1 9
1 1 0 1 13
1 0 0 1 与运算结果

按位或OR |

只要两个位中有一个为1,结果就为1,否则为0。
两个数字做或运算,结果不会变小。
做如下变换:

1 0 0 1 9
1 1 0 1 13
1 1 0 1 或运算结果

按位异或XOR ^

当两个位不同时,结果位为1,否则为0。
两个数做异或运算,可能变大,也可能变小,也可能不变。
异或不会改变最大位宽,即高位全是0
交换律:x^y = y^x
结合律:x^(y^z) = (x^y)^z
自反性:x^x = 0
零元素:x^0 = x
逆运算:x^y = z,则有z^y = x(同时异或y,抵消掉,即自反性)

1 0 0 1 9
1 1 0 1 13
0 0 1 0 异或运算结果

按位取反 ~

对操作数的每一位进行取反操作,即将0变1,将1变0。
通常用于无符号整数unsigned int,避免符号位取反造成干扰。
假设只有4位

0 0 0 1 1
1 1 1 0 按位取反结果

长度不同,结果不同。

按位左移 <<

表示将一个数的二进制向左移动指定的位数。移动后低位补0。
1会移动到符号位上,所以要么使用无符号整型,要么注意不要移动到符号位。

0 0 0 1 1
1 0 0 0 按位左移3结果(9 << 3)

左移相当于对原数进行乘以2的幂次方的操作。
例如5 << 3 = 5(23)

按位右移 >>

将一个操作右移
高位补0,符号位有1不会移走,这是负数位移规则。右移相当于除以2的幂次方向下取整。
负数高位会保留1。

1 1 0 1 13
0 0 1 1 按位右移2结果(13 >> 2)

相当于13/4向下取整。

位运算技巧

判断数字奇偶

公式:x & 1;
结果为1说明是奇数,结果为0说明是偶数。
与1做与运算,高位全为0,个位为1,如果x个位也为1,与运算结果为1,x是奇数;如果x个位为0,与运算结果为0,x是偶数。

获取二进制数的某一位

公式:x >> i & 1;
结果必然为0或1,表示x的二进制表示中的第i位。

修改二进制中的某一位为1或0

公式:x | (1 << i);
将x的第i位或上1,则x[i]变为1,其他位上没有影响。
x的i位是0或1,i位或上1,一定为1。
修改为0类似用与运算,就是构造出只有第i位为0,其他位都为1的数然后做与运算。公式:x & ~(1 << i);

快速判断一个数是否为2的幂次方

公式:x & (x - 1);
如果x为2的幂次方,则x的二进制表示中只有1个,x - 1就有很多个连续的1并且和x的1没有交集,两者与运算一定为0,可证明其他情况必然不为0。

获取二进制位中最低位的1

公式:lowbit(x) = x & -x;
如果x = (010010),则lowbit(x) = (000010)
常用于数据结构[[树状数组]]中。

标签:13,运算,结果,二进制,异或,按位
From: https://www.cnblogs.com/breadcheese/p/18010166

相关文章

  • 【算法】位运算
    常见的位运算操作(操作对象为正整数时)1.按位与(&):当两个数全为1才为1,否则为0。两个数字做与运算,结果不会变大。2.按位或(|):当两个数中有一个1为1,否则为0。两个数字做或运算,结果不会变小。3.按位异或(^):两个数不同为1,相同为0.两个数字做异或运算,结果可能变大,也可能变小。异或的......
  • C++编程练习||实现分数类Fraction1、实现分数的+,-,*,/ 2、逻辑运算==、!=、<、<=、>、>
    题目:实现分数类Fraction  classFraction{   intnumerator,denominator;   public:   ....  };  要求:1、实现分数的+,-,*,/2、逻辑运算==、!=、<、<=、>、>=6种运输符号。3、实现输出<<,输入 >>操作符重载。  样例1输入:   12 ......
  • 3.8新特性——海象运算符
    海象运算符海象运算符,即:=,在PEP572中被提出,并在Python3.8版本中发布。海象运算符的英文原名叫AssignmentExpresions,即赋值表达式。它由一个冒号:和一个等号=组成,即:=。而它被称作walrusoperator(海象运算符),是因为它长得像一只海象。语法格式及解释:variable:=expre......
  • 高精度运算
    逆序voidreverse(string&s){for(inti=0;i<s.size()/2;i++){chart=s[i];s[i]=s[s.size()-1-i];s[s.size()-1-i]=t;}}高精度加法高精+高精stringans;voidadd(stringa,stringb){ans.cl......
  • 第三章——计算机进行小数运算时出错的原因
    在使用小数运算时计算机也会出错,这是因为有些十进制的小数无法转换为二进制数———例如二进制数0.0000对应的十进制数是0,二进制数0.0001对应的十进制数为0.625,由此得之二进制数是连续的而十进制数不是连续的,那十进制数0~0.625之间的数就无法用二进制数表示,进而出现错误。那实际......
  • Java 运算符详解与字符串处理技巧
    Java运算符算术运算符算术运算符用于执行常见的数学运算。运算符名称描述示例+加法将两个值相加x+y-减法从一个值中减去另一个值x-y*乘法将两个值相乘x*y/除法将一个值除以另一个值x/y%取模返回除法余数x%y++自增将变量......
  • 计算机进行小数运算时出错的原因
    看完第三章之后我知道了运算出错的原因是有一些十进制数的小数无法转换成二进制数还有就是小数是使用浮点数表示,浮点数是指符号尾数基数和指数这四个部分组成浮点数的表示右很多种其中最为普遍的是IEEE标准符号部分是指使用一个数据位来表示数值的符号;位数部分使用的是正则表达......
  • 第四章:集合运算
    第四章:集合运算4.1表的加减法4.1.1什么是集合运算集合在数学领域表示“各种各样的事物的总和”,在数据库领域表示记录的集合。具体来说,表、视图和查询的执行结果都是记录的集合,其中的元素为表或者查询结果中的每一行。在标准SQL中,分别对检索结果使用UNION,INTERSECT,EXCEPT......
  • CSAPP 第二章 信息的表示与处理(2) 整数运算
    加减法运算所有的加法运算在内存中的运算都遵循二进制的计算法则,只不过因为相同二进制表示在不同整数类型下表示的数不同,运算法则也有所不同。无符号加法计算规则可以将无符号数的加法视作是一种模运算,在二进制表示中丢弃掉溢出的位的操作就......
  • 13 - 运算符
    运算符汇总参考资料:菜鸟教程:python3运算符Python文档:运算优先级算术运算符以下假设变量a=10,变量b=21:运算符描述实例+加-两个对象相加a+b输出结果31-减-得到负数或是一个数减去另一个数a-b输出结果-11*乘-两个数相乘或是返回一个被重复......