• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

iwanttoberipped

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Day7 运算时脑子有点烧

Day7 运算时脑子有点烧2.0

本节课关于运算符进行了一些补充,主要有三块内容

自增与自减

我们先来看一段代码

public class Demo04 {
    public static void main(String[] args) {
        //自增++、自减--,一元运算符,非常重要!
        int a = 3;
        int b = a++;
        //隐藏了一行代码,即a=a+1,执行完这行代码后,a会+1,它是先给b赋值,再自增,所以b还是3,但是之后a变成4

        System.out.println(a);
        int c = ++a;
        //隐藏了一行代码:a=a+1,但是由于++在前,所以是先自增从4变成5,再给c赋值,
        //所以这里c会变成5,而此时在经过两次自增后,a也已经变成了5

        System.out.println(a);//
        System.out.println(b);
        System.out.println(c);

        //同理a--和--a

        //幂运算 (很多运算会使用工具类来操作)
        double pow = Math.pow(3, 2);
        System.out.println(pow);



    }
}

其结果为

image-20240509163715264

什么意思呢?自增自减的意思(++、--)非常简单,就是在自身的基础上加1,比如原先a=3,在自增后a=4,但是这个自增的时间点是有差别的,比如a++(++在后面)会在整个式子执行后,为a加上1,这个情况下如果进行赋值,则赋值会发生在自增之前,即b=a++,若这个式子被执行,b就会先被赋值,此时b=3,执行后a会自增,此时a=4;

如果是++a(++在前)那么此时执行后自增会发生在赋值之前,c=++a,a会先自增,此时a=5,再赋值给c,此时c=5。

同时还介绍了关于幂运算的知识,这里的幂运算是借助Math的数学工具类来进行的,可以理解为在编程里设定好计算器,其背后也有一套源码,这里暂不深究。

逻辑运算

此部分介绍了逻辑运算符的相关内容,在boolean值的基础上,我们先看一段代码

package operator;

//逻辑运算符
public class Demo5 {
    public static void main(String[] args) {
        //与(and) 或(or) 非(非你即我)
        boolean a = true;
        boolean b = false;

        System.out.println("a && b:"+(a&&b));//逻辑“与”,两个变量都为true,则结果为true,通过加号与字符串结合起来
        System.out.println("a || b:"+(a||b));//逻辑“或”,两个变量一个为true,则两个都为true,同时两个都为false,结果才为false
        System.out.println("!(a && b):"+!(a&&b));//“非”(取反),如果是真则为假,如果是假则为真

        //短路运算
        int c = 5;
        boolean d = (c<4)&&(c++>4);
        System.out.println(d);
        System.out.println(c);
        //1.由于在这个式子里,c<4一定是false在前,所以逻辑运算中,前一个为假
        //则这个逻辑与运算一定为假,它会直接跳过“与”后面的变量直接判断假
        //所以这里c++的自增根本没有被执行,而是被跳过了。这就是短路运算。



    }
}

这里介绍了三种逻辑运算符:&&、||、!

分别为:“与”(and)、“或”(or)、“非”(取反)

上面这段代码的运算结果为:

image-20240509165234754

在这里,a为真,b为假

&&是只有两者都为真,结果才为真

||是两者都为假,结果才为假,也即只要一项为真,那结果就为真

!取反后自然就是原先结果为假,那么取反结果为真

  • ps,这里还介绍了所谓的短路运算,在进行逻辑运算的时候是依序进行的,例如在&&中,若比对的前一项为假,那么就无需比对,直接为假,会略过执行后一项,这里的后一项是c++,在执行后c会自增,本应c=5+1=6,但很显然c完全没有经过自增依然为5,可以得知此项没有被执行,这就是短路运算。

位运算(面试题)

这里还介绍了一下面试可能会遇到的位运算题目,我们来看代码:

package operator;

public class Demo06 {
    public static void main(String[] args) {
        /*
        位运算(面试题)
        A = 0011 1100
        B = 0000 1101

        A&B = 0000 1100(两个都是1,才能使1)
        A|B = 0011 1101(两个都是0,才能为0,否则都是1)
        A^B = 0011 0001 (两个相同才为0,否则为1)
        ~B = 1111 0010(就是简单的取反,原来为1则现在为0)

        2x8 = 16   2*2*2*2
        << >>左移和右移

         */
        System.out.println(2<<3);

        /*
        左移和右移的逻辑其实是二进制的位数计算
        比如0是0000 0000
        1是0000 0001
        那么2是0000 0010
        以此类推8是 0000 1000
        而十六就是 0001 0000
        其实就是将1的位置左移了3位,所以直接就得出结果了
        所以其实<<就是*2,而>>就是/2
         */
    }
}

位运算由于借助2进制,其本质上也变成了某种程度上的逻辑运算,依靠比对来进行:

&的含义是两者都为1,结果才为1

|的含义是两者都为0,结果才为0

^的含义是两者要相同才能为0,否则为1

~就是单纯的取反,原先是0现在是1,反之亦然

在这里会有一类考题,如何快速运算2的倍数运算?

如2*8=16如何实现,依靠位运算非常简单

如1在二进制是0000 0001

而2在二进制是0000 0010

而4在二进制是0000 0100

可以看出*2即为1的位置向左移一位,而/2则为1的位置向右移一位

这两个计算正好对应着<<(左移)和>>(右移)两个运算符,可以非常方便地利用底层二进制逻辑计算类似的内容。

这里的2<<3其实就是2 * 2 * 2,在二进制层面上就是1的位置左移三位,挺好玩的。

posted on 2024-05-09 17:09  宋桥  阅读(10)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3