左移运算符<< 以及右移运算符>>详解

一、机器数及真值

1、机器数

机器数就是数字在计算机中的二进制表示形式,机器数是有符号的,符号位是用一个二进制数的最高位来表示的:0代表正数,1代表负数。例:
假设计算机的字长为8,那 6 的二进制表达则为 0000 0110
-6 的二进制表示为 1000 0110

2、机器数所对应的真值

所谓真值就是将计算机数由二进制转换为十进制,其中最高位为符号位,所代表的数值。
例如: 1001 1101 的真值就为 -29

二、原码、反码与补码

1、原码

原码就是真值的二进制表示,最高位为符号位,以8位二进制表示为例:
6 原码: 0000 0110
-6原码: 1000 0110

2、反码

反码需要通过原码来计算:正数的反码就是原码,负数的反码为符号位不变,其他都取反。例:

[6]真值 -> [0000 0110]原码  -> [0000 0110]反码
[6]真值 -> [1000 0110]原码  -> [1111 1001]反码

3、补码

补码则是需要通过反码进行计算:正数的补码就是原码,负数的补码则是反码+1。例:

[6]真值 -> [0000 0110]原码  -> [0000 0110]反码 ->	[0000 0110]补码
[6]真值 -> [1000 0110]原码  -> [1111 1001]反码 ->	[1111 1010]补码

4、补码转原码

(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,源求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。

三、二进制、十进制、八进制、十六进制间的转换

二进制:用 0 和 1 来表示,二进一。
八进制:用0~7来表示,八进一。
十进制:用0~9来表示,十进一。
十六进制:用0~9以及字母A(10)、B(11)、C(12)、D(13)、E(14)、F(15)来表示,十六进一。

1、二进制转十进制

二进制:0000 1110 0110
十进制:2^1 + 2^2 + 2^5 + 2^6 + 2^7  = 230

2、八进制转十进制

八进制:1234
十进制:1234 = (1 × 8³) + (2 × 8²) + (3 × 8¹) + (4 × 8⁰) = 668

3、十六进制转十进制

十六进制:1AB
十进制:(1 × 16²) + (10 × 16¹) + (11 × 16⁰) = 427

4、十六进制转二进制

十六进制:1AB
二进制:0001 1010 1011
可以先将十六进制转换为十进制,再转为二进制。也可以将每个数字转为四位的二进制,然后拼接在一起。如:
1为0001 , A为1010 , B为1011 , 故其二进制表示为0001 1010 1011

四、左移运算符<<以及右移运算符>>的使用

计算机中的数字是以二进制补码的形式存放的,所以无论是左移运算符还是右移运算符,其都是需要先将目标数转换为二进制,然后求其补码,再进行运算。

1、左移运算符使用

运算规则:不区分正负数,将最高位抛弃,然后在低位补0,例:
求: 10<<3

10的原码: 0000 0000 0000 0000 0000 0000 0000 1010
10的反码: 0000 0000 0000 0000 0000 0000 0000 1010
10的补码: 0000 0000 0000 0000 0000 0000 0000 1010
左移三位: 0 0000 0000 0000 0000 0000 0000 1010
低位补充0: 0 0000 0000 0000 0000 0000 0000 1010 000
结果:80

求: -10<<3

-10的原码: 1000 0000 0000 0000 0000 0000 0000 1010
-10的反码: 1111 1111 1111 1111 1111 1111 1111 0101
-10的补码: 1111 1111 1111 1111 1111 1111 1111 0110
左移三位: 1 1111 1111 1111 1111 1111 1111 0110
低位补充0: 1 1111 1111 1111 1111 1111 1111 0110 000
转为原码: 1000 0000 0000 0000 0000 0000 0101 0000
结果:-80

2、右移运算符的使用

右移的话分为逻辑右移以及算术右移,这里只考虑算术右移,需要区分正负数。
(1)正数算术右移:将最低位抛弃,最高位补0,例:
求: 10>>3

10的原码: 0000 0000 0000 0000 0000 0000 0000 1010
10的反码: 0000 0000 0000 0000 0000 0000 0000 1010
10的补码: 0000 0000 0000 0000 0000 0000 0000 1010
右移三位: 0000 0000 0000 0000 0000 0000 0000 1
高位补充0: 000 0000 0000 0000 0000 0000 0000 0000 1
结果:1

(2)负数算术右移:将最低位抛弃,最高位补1,例:
求: -10>>3

-10的原码: 1000 0000 0000 0000 0000 0000 0000 1010
-10的反码: 1111 1111 1111 1111 1111 1111 1111 0101
-10的补码: 1111 1111 1111 1111 1111 1111 1111 0110
右移三位:   1111 1111 1111 1111 1111 1111 1111 0
高位补充1: 111 1111 1111 1111 1111 1111 1111 1111 0
转为原码: 1000 0000 0000 0000 0000 0000 0000 0010
结果:-2
  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值