位运算详解

位运算

大概可以分为两类

在这里插入图片描述
在这里插入图片描述
与:两个是1才是1
或:只要有一个是1就是1
异或:只有11跟或不同,其他一样。(更好的记忆方式:相同是0)
取反:0变1,1变0

左移:乘以2(不是变为原来的2倍大!! -8 << 1 变成 -16,是原来的一半了,是乘以2)
右移:乘以1/2
无符号右移:正数跟 “右移” 是一样的效果(乘以2),负数好像没规律。
无符号左移:不存在这种

无符号左移 和 无符号右移,究竟哪个是不存在的,有时候容易记混,就记住只有往右边移动的时候才需要考虑补0还是1就行了。往左边移动只有一种可能,即补0.

详细

1、“与” 运算(&)

运算规则: 两个参与运算的数据,按照它们的二进制位进行运算,只有两个位都是1的时候结果才是1,否则是0。例如1&1=1,1&0=0,0&1=0,0&0=0

举例: 3&5=? 首先将3换算成成2二进制数,3是 0000_0011,5是 0000_0101,则

 0000_0011
&0000_0101
=0000_0001
 即结果是十进制的1

补充:1、负数按补码的形式参与 “与” 运算。

用途

1)将某些位的值变成0

比如 0010_1010,如果跟 0000_1100按位 "与",就是把高4位以及低2位变成0,结果如  0000_1000

2)检测某个位的值是不是1

比如有个值是 0000_0101,它的每个位代表着一个开关,0是关1是开,我怎么知道某个位上的值是什么?

比如和 0000_0001按位 "与" 就可以得到右边第一位是不是1,检测右边第二位是否1可以跟 0000_0010 按位 "与",如此类推...

3)取一个数的某几位的值(其实跟第二种用法差不多)

比如,有个值是 0010_0101,要取高4位,就跟 1111_0000 运算得到 0010_0000;要取低4位,就跟 0000_1111 运算得到 0000_0101;要取指定位上的值,只要跟那个位上是1的数进行按位 "与" 就行了。

其实原理就是可以用1去试探,只有原来的值是1才会得到1,原来是0,也得到0,所以得到什么值表示了原来是什么值

2、“或” 运算(|)

运算规则: 将两个要运算的数据,按照它们的二进制位,进行 “或” 运算,即只要有一个是1,结果就是1。如:1|0=1,0|1=1,1|1=1,0|0=0

举例: 3|5=? 换算一下,3是 0000_0011,5是 0000_0101,则

 0000_0011
|0000_0101
=0000_0111
即结果是十进制的7

补充:1、负数的按位 “或” 要转换为补码的形式再进行计算。

用途

1)把某个位上的值改成1

例如 0000_0101,要把右边第二位改成1,只要和 0000_0010 按位 "与" 即可。
3、“异或” 运算(^)

运算规则: 异或,就是特殊的 “或”,在或的基础上改一下。0|0=0,0|1=1,1|0=1,1|1=0,加粗的就是跟 “或” 不一样的。

举例: 3^5,3转成二进制,则

 0000_0011
^0000_0101
=0000_0110
即十进制的6

用途

1)让一个数的位0变1,1变0(有人疑惑,这不是取反运算符也可以吗?,不同,这个可以按自己需要指定哪几位)

比如有个值 0100_0101,我想翻转,则跟 1111_1111 进行按位 "异或",得到 1011_1010

2)与0相异或,保留原值 ,1010_1110 ^ 0000 0000 = 1010_1110。

4、取反运算(~)

运算规则: 取反,很简单,就是0=1,1=0。它是单目运算符

举例: ~3

 ~0000_0011=1111_1100,即十进制的252

用途

就是取反的用途。

5、左移运算(<<)

正数负数都是相同的处理方式:高位溢出的丢弃,低位不足的补0

效果:值乘以2。但有些情况会溢出得到负数。

如图:short是2字节即8位的, a << 1 确实是结果乘以2,但是 a << 2 的时候高位的1也被舍去了。
如果short不是2字节,比如说是3字节,这个1就不会被舍弃,然后 “左移1位就是乘以2” 的结论也不会打破。之所以左移变成了负数,就是因为乘以2的值大于边界了。

在这里插入图片描述

6、右移运算(>>)

正负数的右移处理方式不同

  • 正数:高位补0,低位溢出的舍去
  • 负数:高位补1,低位溢出的舍去

在这里插入图片描述
在这里插入图片描述

7、无符号右移(>>>)

正数的右移(>>)和无符号右移动(>>>)应该是完全等价的
(所以看到了ArrayList的扩容,使用的是 >> 而没有使用>>>,其实是等价的。int newCapacity = oldCapacity + (oldCapacity >> 1);)

>>> 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。

例如:var temp = -14 >>> 2

变量 temp 的值为 -14 (即二进制的 11111111_11111111_11111111_11110010),向右移两位后等于 1073741820 (即二进制的 00111111_11111111_11111111_11111100)。

无符号右移就是不管是正数还是负数高位补0(跟右移不一样,右移要兼顾正负符号,正数右移补0,负数右移补1,而 “无符号右移” 不区分,一律补0
在这里插入图片描述

8、无符号左移(<<<)

注意注意,是没有这种。

  • 19
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
矩阵运算是一种广泛应用于数值计算和科学计算的运算方式,能够高效、准确地处理大量数据。Matlab作为一种专业的数学软件,提供了丰富的矩阵运算功能,下面将对常见的矩阵运算进行详细解释。 1. 矩阵乘法 矩阵乘法是矩阵运算中最基础的运算,它的实现方法是将一个矩阵的每一行与另一个矩阵的每一列进行内积运算,并将结果相加。在Matlab中,可以使用“*”运算符来进行矩阵乘法。 例如,对于两个矩阵A和B,它们的矩阵乘积C可以表示为: C = A * B 需要注意的是,矩阵乘法要求左边矩阵的列数与右边矩阵的行数相等,否则无法进行乘法运算。 2. 矩阵加法和减法 矩阵加法和减法是通过对应元素的加减来实现的。在Matlab中,可以使用“+”和“-”运算符来进行矩阵加法和减法。 例如,对于两个矩阵A和B,它们的矩阵加法和减法分别表示为: C = A + B D = A - B 需要注意的是,两个矩阵进行加减法的前提条件是它们的维度相同。 3. 矩阵转置 矩阵转置是将矩阵的行列互换的操作,可以使用“'”运算符来进行矩阵转置。 例如,对于一个矩阵A,它的转置矩阵表示为: B = A' 需要注意的是,矩阵转置不改变矩阵的元素值,只是改变了它们的排列顺序。 4. 矩阵求逆 矩阵求逆是指对于一个可逆矩阵,求出其逆矩阵的过程。在Matlab中,可以使用“inv”函数来求矩阵的逆。 例如,对于一个可逆矩阵A,它的逆矩阵表示为: B = inv(A) 需要注意的是,非可逆矩阵没有逆矩阵。 5. 矩阵求行列式 矩阵行列式是一个数值,它可以用来判断矩阵是否可逆。在Matlab中,可以使用“det”函数来求矩阵的行列式。 例如,对于一个矩阵A,它的行列式表示为: d = det(A) 需要注意的是,行列式为0的矩阵是不可逆的。 6. 矩阵求特征值和特征向量 矩阵的特征值和特征向量是矩阵在线性变换下的重要性质,在许多数学问题中都有广泛的应用。在Matlab中,可以使用“eig”函数来求矩阵的特征值和特征向量。 例如,对于一个矩阵A,它的特征值和特征向量分别表示为: [V,D] = eig(A) 其中,V为特征向量矩阵,D为特征值矩阵。 以上是Matlab中常见的矩阵运算,它们在数值计算、科学计算、数据分析等领域中都有广泛的应用。需要注意的是,在进行矩阵运算时,要特别关注矩阵的维度和性质,以确保运算的正确性和有效性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值