运算符and操作符详解

这里写目录标题

  • 运算符
    • 1.算数运算符
      • (1)基本四则运算符 + - * / %
      • (2)自增/自减运算符 ++
      • (3)增量赋值运算符 += -= *= /= %
    • 2.逻辑运算符
    • 3.位运算符
      • (1)按位与 &:
      • (2)按位或 |:
      • (3)按位取反 ~:
      • (4)按位异或 ^:
    • 4.移位运算(了解)
      • (1)左移 <<:
      • (2)右移 >>:
      • (3)无符号右移 >>>:
      • (4) 注意:
    • 条件运算符
      • (1)三目运算符:
  • 操作符详解
    • 算数操作符
    • 位操作符

运算符

1.算数运算符

(1)基本四则运算符 + - * / %

(2)自增/自减运算符 ++

a++:先取a的值再++ ++a:先自增再取值

(3)增量赋值运算符 += -= *= /= %

2.逻辑运算符

(1)逻辑运算符主要有三个: && || !
注意: 逻辑运算符的操作数(操作数往往是关系运算符的结果)和返回值都是 boolean
(2)逻辑与 &&
规则: 两个操作数都为 true, 结果为 true, 否则结果为 false
(3)逻辑或 ||
规则: 两个操作数都为 false, 结果为 false, 否则结果为 true
(4)逻辑非 !
规则: 操作数为 true, 结果为 false; 操作数为 false, 结果为 true(这是个单目运算符, 只有一个操作数).

3.位运算符

Java 中对数据的操作的最小单位不是字节, 而是二进制位.
位运算符主要有四个:
& | ~ ^
位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算.

(1)按位与 &:

如果两个二进制位都是 1, 则结果为 1, 否则结果为 0

(2)按位或 |:

如果两个二进制位都是 0, 则结果为 0, 否则结果为 1

(3)按位取反 ~:

如果该位为 0 则转为 1, 如果该位为 1 则转为 0

(4)按位异或 ^:

如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1 。

4.移位运算(了解)

移位运算符有三个: << >> >>> 都是按照二进制位来运算.

(1)左移 <<:

最左侧位不要了, 最右侧补 0

(2)右移 >>:

最右侧位不要了, 最左侧补符号位(正数补0, 负数补1

(3)无符号右移 >>>:

最右侧位不要了, 最左侧补 0

(4) 注意:

  1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
  2. 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
  3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代
    替.
  4. 移动负数位或者移位位数过大都没有意义

条件运算符

(1)三目运算符:

是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法
条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3

int a = 10;
int b = 20;
int c= a < b ? a : b;//如果a

操作符详解

算数操作符

    位移操作符
    位操作符
    赋值操作符
    单目操作符
    关系操作符
    逻辑操作符
    条件操作符
    逗号表达式
    下标引用、函数调用和结构成员
    **算术操作符**
             +     -     *     /     %  ++  --
       (1)只有正数可以取模—%,返回的是整除之后的余数
           除了%操作符以外,其余操作符均可作用于整数和浮点数
      (2)对于/操作符,如果两个操作数都为正数,执行整数除法,而只要有浮点数执行的就是浮点数除法

位移操作符

<<     //左移操作符
>>     //右移操作符

注(1)左移操作符和右移操作符都只针对二进制位进行移位

左移操作符移位规则:左边抛弃、右边用零补

int num =1000000000000000000000000000001010//num在内存中中的二进制
0 00000000000000000000000000010100//num左移一位产生的结果,
                                 //但实际上num在每被赋值的情况下,自身的值不会变化

    num<<1

右移操作符右移运算分两种
(1) 逻辑位移 :左边用零填充,右边丢弃
(2)算数位移 左边用原该值的符号位填充,右边丢弃

int num = -1;//我们假设num=-1,这样内存中存储-1的补码为32个全1
11111111 11111111 11111111 11111111
**算数右移**:左边用原该值的符号位填充
11111111 11111111 11111111 11111111
由于是负数,所以符号位为1,即左边补1
**逻辑右移**:左边补0
01111111 11111111 11111111 11111111

警告:对于位移运算符,不要移动负数为,这个是标准未定义的
例如

int num = 10;
num>>-1;//error

整形存储
(1)原码 反码 补码
将原码直接转成二进制

正数 (1)在计算机中也存的补码
(2)原码 == 反码 ==补码

00000000  00000000 00000000 00000001//原码==反码==补码
int main()
{
    int i=1;
    printf("%d\n",i<<1);
    return 0;
}

负数 (1)在计算机中存补码
(2)有符号数,最高位是符号位,1表示负数,0表示正数

10000000 00000000 00000000 00000001
11111111 111111111 11111111 11111110  //反码:符号位不变,其他位取反
11111111 111111111 11111111 11111111   //补码=反码+1

为什么负数在计算机中存补码,因为CPU只有加法器

#include
int main()
{
   int i=1;
   int j=-1;
   printf("%d\n",i<<1);
   printf("%d\n",i<<1);
   printf("%d\n",i>>1);
   printf("%d\n",j>>1);
   printf("%d\n",j>>5);
   return 0;
}

位操作符

&  //按位与 0与任何数&都是0   && 逻辑与 用来判断真假
|   //按位或  有1就是1
^  //按位异或  相同为0,不同为1

你可能感兴趣的:(c++,java)