一、前言

学习目标:

  • 掌握 原码 反码 补码 基本运算以及转换
  • 熟练应用 与 或 非 同或 异或 应用
  • 对于 移位运算 在题目中熟练应用,后面会出位运算的题目

二、概述

计算机最主要的功能是处理数值、文字、声音、图形图像等信息。

在计算机内部,各种信息都必须经过数字化编码后才能被传送、存储和处理,所有的数据以二进制的形式存储在设备中,即 0、1 这两种状态。

计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,例如下面的计算:

int a=74;
int b=58;
int c=a+b;

a  74 :  1 0 0 1 0 1 0
b  58 :     1 1 1 0 1 0
c 132 : 1 0 0 0 0 1 0 0

十进制数字转换成底层的二进制数字之后,二进制逐位相加,满2进1。

三、原码 反码 补码

1.原码

在计算机的运算中,计算机只能做加法,减法、乘除都没法计算。原码是最简单的机器数表示法,用最高位表示符号位,其他位存放该数的二进制的绝对值。

2.png

首位的0表示正数、1表示负数。

特点

  • 表示直观易懂,正负数区分清晰
  • 加减法运算复杂,要先判断符号是正号还是负号、相同还是相反

2.反码

正数的反码还是等于原码,负数的反码就是它的原码除符号位外,按位取反。

1.png

特点

  • 反码的表示范围与原码的表示范围相同
  • 反码表示在计算机中往往作为数码变换的中间环节

3.补码

正数的补码等于它的原码,负数的补码等于反码+1

3.png

特点:

  • 在计算机运算时,都是以补码的方式运算的,下面的位运算也是补码形式计算

四、基本运算

1.与

符号:&

运算规则:两个二进制位都为1时才为1,否则为0

示例:1001&1111=1001

2.或

符号:|

运算规则:两个二进制位都为0时才为0,否则为1

示例:1001&1100=1101

3.非

符号:~

运算规则:首位符号位不变,0变成1,1变成0,在最后一位+1

示例:~1001 = 0110

4.同或

符号:~

运算规则:数字相同时为1,相反为0

示例:1001~1100=1010

5.异或

符号:^

运算规则:两个二进制位相反为1,相同为0

示例:1001^0111=1110

五、移位运算

1.左移

符号:<<

运算规则:符号位不变,低位补0

示例

a<<b 代表十进制数字a向左移动b个进位
/* 左移:
 * 左移1位,相当于原数值 * 2
 * 左移2位,相当于原数值 * 4
 * 左移n位,相当于原数值 * 2^n
 */
计算 10 << 1
10的补码:0000 1010
-----------------------
结果补码:0001 0100 ==> 正数,即 10*2=20

计算 10 << 2
10的补码:0000 1010
-----------------------
结果补码:0010 1000 ==> 正数,即 10*2^2=40

计算 10 << 3
10的补码:0000 1010
-----------------------
结果补码:0101 0000 ==> 正数,即 10*2^3=80

计算 12 << 1
12的补码:0000 1100
-----------------------
结果补码:0001 1000 ==> 正数,即 12*2=24

2.右移

符号:>>

运算规则:低位溢出,符号位不变,并用符号位补溢出的高位

示例

a>>b 代表十进制数字a向右移动b个进位
/* 右移:
 * 右移1位,相当于原数值 / 2
 * 右移2位,相当于原数值 / 4
 * 右移3位,相当于原数值 / 2^n
 * 结果没有小数(向下取整)
 */
计算 80 >> 1
80的补码:0101 0000
-----------------------
结果补码:0010 1000 ==> 正数,即 80/2=40

计算 80 >> 2
80的补码:0101 0000
-----------------------
结果补码:0001 01000 ==> 正数,即 80/2^2=20

计算 80 >> 3
80的补码:0101 0000
-----------------------
结果补码:0000 1010 ==> 正数,即 80/2^3=10

计算 24 >> 1
12的补码:0001 1000
-----------------------
结果补码:0000 1100 ==> 正数,即 24/2=12

原码反码补码部分的参考图片:原码反码补码