位运算

2023-10-11 21:13:12 浏览数 (1)

之前我们在进制里面讲到了机器数、原码反码和补码以及负二进制为什么要用三种形式来表现。

我这里再补一张图,如果大家对原码反码和补码有什么不懂的话,可以去看我之前的笔记。 假设字长是8位

移位运算符

<<表示左移运算符 一般格式位x<<n n>=0 上述表示将x的二进制数左移n位。将高位移出时候,需要将低位补0 比如:0010<<2 = 1000 计算(-10)<<2 = ? -10转成二进制为10001010这是原码 我们再把他转换成补码进行计算 11110110 <<2 = 11011000 再转成十进制-40 也就是乘以2^n。 >>表示右移运算符 一般格式x<<n n>=0 上述表述将x的二进制数右移n位,将低位移出时候,需要将高位补0 x = 00111100 x>>2 = 00001111 正数的原码补码一样,但是附属如果要右移,左端需要补符号位 比如:x = -10 X>>1 = 11111011 再转成十进制就是-5 也就是除以2^n

位逻辑运算符

~(按位取反)

单目运算符,把一个数的二进制按位取反,即0变1,1变0 a = 4 二进制00000100 ~a = 11111011 结果为十进制的-5 其中负数的最高位也需要取反。

&(按位与)

双目运算符,对参加运算的两个操作数按二进制位进行逻辑与运算。如果两个相应位都是1,则该位运算的结果为1,否则为0。即 0&0 = 0 1&1 = 1 1&0 = 0 比如 00001011 & 00001010 ---------------------

代码语言:javascript复制
    00001010

按位"与"运算常用来把一个数的某些位清0,保留另外一些位。例如把a的低四位清0,只保留高位,可做a&11110000运算。

|(按位或运算)

双目运算符,对参加运算的两个操作数进行"或运算",只要两个相应位有一个1时,该运算的结果为1,即0|0 = 0 0|1 = 1 1|1 = 0 比如 00110000 | 00001111 ----------------------

代码语言:javascript复制
    00010011

按位"或"运算,可以把一个数的某些位置置1,其余为保持不变。例如把a的低四位置1,高四位不变,可作a|00001111运算

^按位异或运算

双目运算符,对参加运算的两个数按位进行异或运算。当两个相应位相异时,该位的运算结果为1,否则为0。即0^0 = 0 0^1 = 1 1^1 = 0 比如 00111001 ^ 00101010 ---------------------

代码语言:javascript复制
       00010011

按位异或可以将一个数清0,比如a^a 1^1 = 0 0^0 = 0 所以a = 0; 二进制的位运算,只按相应位的数值进行进行运算,不受正数 负数 原码反码和补码的限制。逻辑运算与位逻辑运算的最大区别是前者得到的是0或1,而后者得到的是整型数据

优先级

单目位逻辑运算符的优先性与单目算数运算符、单目逻辑运算符、自增自减运算符同级别。同级运算符的结合性是自右向左 双目位逻辑运算符的优先级低于关系运算符,高于双目逻辑运算符。而双目位逻辑运算符中,&优先于^ ^优先于|

位自反赋值运算符

位运算符和赋值运算符可以组成位自反赋值运算符,共有五种,分别是>>=、<<=、&=、|=、^=。类似于 =是双目运算符,左边是变量右边是表达式,用于将某个变量和表达式进行指定位运算之后,把结果赋值给变量 例如a<<=b 相当于a = a<<b 假设a的变量值是3 a<<2 即a 向左移两位(*2^2),结果是a = 12 再如 a =11,b= 5 则a|=b 5; 相当于a = a|(b 5) 11|10 = 11 故a = 11 位自反赋值运算符和赋值运算符、算数自反赋值运算符同级,同级赋值运算符的结合性是自右向左

0 人点赞