一.整数的二进制表示形式(三种)
原码
把一个数按照 正负 直接翻译成 二进制 ——这就是 原码
反码
最高位——符号位(~) ~不变 其余位 按位取反【0表示正数 1表示负数】
补码
反码+1 ——就是补码
整数在内存中的存储是补码(结论)
整数是存放在整型变量中的 (包括正整数 和 负整数)而一个整型变量是四个字节(32个比特位)因此除了用二进制来表示这个整数外,还需要补齐32个比特位的剩余位数。如下图
![](https://i-blog.csdnimg.cn/blog_migrate/bd4df5d41bceabb4016fbdfa6f379eb8.png)
举个例子:写出-5的原反补码 如下图
![](https://i-blog.csdnimg.cn/blog_migrate/35b05fa4ecc8d67f4ddf3dbef1b84a94.png)
在vs进行调试之后 查看内存地址 (vs为了方便 ——将四个二进制数转换为一个十六进制数)
二.移位操作符
3.左移(<<)操作符的实操与原理
![](https://i-blog.csdnimg.cn/blog_migrate/8ba5aee06a933e7389935504226a8643.png)
我们把a拿出来 用二进制的形式进行表示
![](https://i-blog.csdnimg.cn/blog_migrate/bdcafcd7f3922ea63d9c84a6db3a6790.png)
移位后110的二进制值是6 所以打印出来的值就是6 那么b就是6
![](https://i-blog.csdnimg.cn/blog_migrate/8737c22aa2e153fbabdd8c0bc53b1fdc.png)
左移:左边丢弃 右边补0
我们写一个-3 然后向左移动一位
![](https://i-blog.csdnimg.cn/blog_migrate/b7ecdcfe305ad926aaf74d6e06fee395.png)
补码转换成原码有以下两种方式:
![](https://i-blog.csdnimg.cn/blog_migrate/d682ef235c6ab2570c1c2d0499b3d7e4.png)
因为我们能看到的是原码 所以将补码转换成原码之后再将它打印出来
![](https://i-blog.csdnimg.cn/blog_migrate/24d5a15dc74e9945581aa8e115cc1f60.png)
总结:以上是我们左移操作符的详细过程!
右移(>>)操作符
至于我们采用的是算数右移or逻辑右移 这是取决于编译器的!
如果要看编译器用1 or 2 要用负数来测试
因为正数的符号位是0 如果用正数的话 那么 1 or 2 的符号位就相同
逻辑右移(1)
左边用0来补充 右边丢弃
算数右移(2)
左边是用原来的符号位来补充 右边丢弃
对于 移位运算符 来说 没有移动 负数 的说法 ,比如
![](https://i-blog.csdnimg.cn/blog_migrate/9750a0828e8c61df31ee5404735fb42d.png)
因此,只能向左移动 正数 位,或者向右移动 正数 位
三.位操作符
这个“位”是 二进制位
按位与 ( & )
按位或 ( | )
按位异或 ( ^ )
注意:它们的操作数必须是整数!这里是对他们的二进制数进行 “按位与 按位或 按位异或“
1.按位与:对应的二进制位进行按位与 有0 才为 0
![](https://i-blog.csdnimg.cn/blog_migrate/e3887a5634a0b7889f3e752da842efc8.png)
总结:-5和3的补码进行按位与 然后赋值给c
2.按位或:有1才为1
![](https://i-blog.csdnimg.cn/blog_migrate/b08aea78686b2f390a2aa55b5613d211.png)
3.按位异或:相同为0 不同为1
![](https://i-blog.csdnimg.cn/blog_migrate/cb3e1ff5d90b893ecfd7a5bd804aa73f.png)
巧记^的公式:a^a = 0 相同为0
0^a = a
举个例子:3 ^3 ^ 5 = 5
Q :上面这个公式有什么用呢?
A : 它可以通过不创建第三个变量 就可以实现两个数的交换
![](https://i-blog.csdnimg.cn/blog_migrate/62530682c8e663d7d33266e49361f885.png)
按位异或 有个好处 :它只会进行 0 or 1的替换 永远不可能变成2 所以它永远不会溢出!
你想要得到一个数的最低位是几 你只需要那这个数去 按位与 (1)00000000000000000000000000000001就可以得到这个数是几