目录学前须知1.移位操作符,1.1左移操作符2.2右移操作符2.位操作符|^,~2.1位操作符的作用2.2位操作符解题2.2.1 第一题2.2.2 第二题3.逗号表达式4.总结学前须知1.数据在计算机中是以补码存储的。2.位移操作符位操作符直接对内存中存储的补码进行运算。3.正数的原码反码补码均相同。4.负数原码转为补码补码转为原码都是符号位不变数值位取反再1 。1.移位操作符,1.1左移操作符已知int型数据在内存中占4个字节的大小且int默认是有符号整数10的二进制为1010当左移之后最左边的二进制位会溢出而被抛弃最右边的数默认补0因此数值变成了20。另外还需注意我们虽然对num 1,但是num本身的值是不会变的还是10。2.2右移操作符右移操作符和左移操作符大体上一样但是也有区别主要分为两种。1.逻辑右移左边空出来的用0填充右边丢弃。2.算数右移左边用该值的原符号位填充右边丢弃。那么我们该如何判断是逻辑右移还是算术右移这个我们可以自己验证一下。假如说给一个负数比如说-10他的符号位是1那么我们假设我们使用的编译器是算术右移那么-10的补码右移过后最左边就应该补1得到的还是一个负数那如果我们编译器得到的是逻辑右移呢右移之后左边补0也就是说最后得到的是一个正数。简单来说给一个负数如果右移过后的结果是正数那么就是逻辑右移如果结果还是负数那么就是算数右移。可以看出-10右移之后的结果是-5还是一个负数因此我们使用的解释器使用的是算术右移。同样我们对num 1之后num本身的值不会发生变化。2.位操作符|^,~2.1位操作符的作用 //按位与 | //按位或 ^ //按位异或 ~ //按位取反需注意位操作符的操作数只能是整数。作用1.按位与对齐的二进制位如果有一个0该位按位与之后的结果就是0。2.按位或对齐的二进制位如果有一个1该位按位或之后的结果就是1。3.按位异或对齐的二进制位只要不相同该位异或之后的结果就是1。以上三个操作符的操作数都是2个。4.按位取反操作数只有一个0变11变0。具体如下2.2位操作符解题使用位操作符解题时我们需要先知道关于异或的一些操作1. a ^ 0 之后的结果还是a2. a ^ a 之后的结果是03.异或支持交换律也就是说 a ^ b ^ a 其实等同于 a ^ a ^ b 那么我们就能进一步得到 a^a^b- 0^b - b以上的结论都可以自己用数值验证。2.2.1 第一题如何在不创建第三个变量的前提下实现两数交换2.2.2 第二题编写代码实现求⼀个整数存储在内存中的⼆进制中1的个数。要想解这道题我们需要知道这样一个结论num 1就能得到num最后一位的值num 1 1 ---------- num最后一位是1num 1 0 ---------- num最后一位是0原理很简单因为假设是一个int型的数值1按位与上num那么1的补码就是000……31个0……1只有最后一位是1所以得到的结果中前面31位必然是0最后一位要看num的最后一位是否是1是1的话那么最终结果就是1num最后一位是0的话那么最终结果就是0。因此我们解决该问题的方法如下法一法二:我们依然需要知道这个结论每次执行 n n (n-1) 得到的结果中n最右边的1会变成0可以发现n本来是1101结果每执行一次 n (n-1) 时n最右边就会少一个1所以利用这个结论我们也能解这道题目3.逗号表达式逗号表达式就是⽤逗号隔开的多个表达式。逗号表达式从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。4.总结通过以上内容我们可以总结一下位操作符的一些运算技巧。1. a ^ 0 之后的结果还是a2. a ^ a 之后的结果是03. 异或支持交换律4. n 1能得到n最后一位是1还是05. 每次执行 n n (n-1) 得到的结果中n最右边的1会变成0