原码,反码,补码简介
*原码
- 二进制的定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
- 例:通过一个字节表示 +7 原码:0(符号位) 0000111
- -7原码:1(符号位) 0000111
*反码
正数的反码与原码一样;负数的反码是对其除符号位外逐位取反,1变0,0变1;
*补码
正数的补码与原码一样;负数的补码是它的反码加1求和;
方法:求负数的补码:依照原码求出反码再加1
求负数的补码的原码:补码-1再求出原码
计算机都是以数据的补码进行存储和运算的,所以进行有关于负数运算的时候要注意。必须先求出负数的补码再运算,而正数则不用,因为它的补码是它的本身。
位运算
位运算符的分类以及用法
- 与 & 有0则0,表达式两边都为true才true
- 或 | 有1则1 ,表达式只要有一边为true就true
- 异或 ^ 相同则0,不同则1,表达式两边相反则true
- 取反 ~ 按位取反(符号位也需要,和求反码不一样)
- 有符号位左移 << a>>b,a向左移动b位,则是a乘以2的b次幂
- 有符号位右移 >> 与左移相反,则是a除以2的b次幂
- 无符号位右移 >>> 忽略符号位,空位都以0补齐
口诀:
正数取反等于正数加1取负 例11取反等于-12
负数取反等于负数加1取正 例-7取反等于6
注意点:
负数的位运算:
例 :-7&-1
-7的补码: 1 111 1001
-1的补码:1 111 1111
相与:1 111 1001 求出了结果的补码**(注意:答案不是这个,还要求出它的原码)**
1 111 1000 接着求出结果的反码
1 000 0 111 最后是求出它的原码 ,为 -7
面试题
实现两个数值的交换,不能定义第三方变量
异或运算^的特征:一个数异或同一个数两次等于它本身,不变。
而开发的时候多使用定义第三方变量的方法: