zoukankan      html  css  js  c++  java
  • JAVA入门到精通-第20/21讲-二进制.位运算.位移运算

     
     1,0是电流最稳定的情况;“逢二进一”;
     1个字节=8位;
     最高位表示的是符号位;0表示正数,1表示负数;
     
     
    在计算机运算的时候,都是以补码的方式来运算的;
    但是显示的时候是以原码显示的;
     
     取反是不管符号位,是否正负的;
     取反的结果,以1开头的,是负数,要转成原码;
     
     
    close project ,关闭Eclipse工程的内存;
       
    ~ -5
    负数的运算要以补码来做;
    对补码取反(取反不涉及符号位,看结果是否正数);

     -3 ^ 3
     异或运算:相同为0,不同为1;相异为1;
     
     
    位运算还是移位运算都是以补码形式运算;
     
     
     左移简单:左移补0就行; 
     右移需要用符号位去补溢出的高位;
     
     -1 >> 2 等于 -1;
     
     
    >>> 逻辑右移;
     
     

     
     
     Clerk[]数组大小该 如何解决?
      
     当集合类满足不了需求的时候,需要自己写链表;
      
     
     
     
     增、删、改、显示;
      
     
     
     
     
    add实现尾部加入:
     
     
     get返回的是object类型;
     
     进行强制转换;
     source-General,在myEclipse中提供方法
     
      a1的特点就是 引用;放入同样的对象不会冲突,放在对尾的;
     
     

    二进制、位运算

    思考题

    1、请看下面的代码段,回答a,b,c,d,e结果是多少?

    public static void main(String []args){

        int a=1>>2;

        int b=-1>>2;

        int c=1<<2;

        int d=-1<<2;

        int e=3>>>2;

        //a,b,c,d,e结果是多少

        System.out.println("a="+a);//a=0

        System.out.println("b="+b);//b=-1

        System.out.println("c="+c);//c=4

        System.out.println("d="+d);//d=-4

        System.out.println("e="+e);//e=0

    }

    注:">>"代表算术右移,"<<"代表算术左移,">>>"代表逻辑右移

     

    2、请回答在java中,下面的表达式运算的结果是:

    ~2=?    //-3

    2&3=?   //2

    2|3=?   //3

    ~-5=?   //4

    13&7=?  //5

    5|4=?   //5

    -3^3=?  //-2

    注:"~"代表位取反,"&"代表位与,"|"代表位或,"^"代表位异或

     

    二进制--基本概念

    二进制是逢2进位的进位制,01是基本算符。

        现代的电子计算机技术全部采用的是二进制,因为它只使用01两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用01两个数字及其组合来表示任何数。进位规则是“逢21”,数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。

    注:1个字节=8bit,

    bit最高位是符号位如:■□□□□□□□黑色方框为符号位。

    符号位0代表正数,1代表负数

     

    二进制--原码、反码、补码

    对于有符号的而言:

    1、二进制的最高位是符号位:0表示正数,1表示负数

    2、正数的原码、反码、补码都一样

    3、负数的反码=它的原码符号位不变,其它位取反

    4、负数的补码=它的反码+1

    50的反码,补码都是0

    6java没有无符号数,换言之,java中的数都是有符号的

    7、在计算机运算的时候,都是以补码的方式来运算的。

     

    位运算符和移位运算

    java中有4个位运算,分别是“按位与&、按位或|、按位异或^,按位取反~,它们的运算规则是:

    按位与&:两位全为1,结果为1

    按位或|:两位有一个为1,结果为1

    按位异或^:两位一个为0,一个为1,结果为1

    按位取反:0->11->0

     

    java中有3个移位运算符:

    >><<算术右移和算术左移,运算规则:

    算术右移:低位溢出,符号位不变,并用符号位补溢出的高位

    算术左移:符号位不变,低位补0

    >>>逻辑右移,运算规则是:低们溢出,高位补0

     

    -------------------------------------------------------------------------------

    集合框架

    一个问题?

        前面我们学习了数组,充分体会到数组的优越性,就是可以存储同一类型的数据,但是我们假设有这样的需求,大家看看如何解决?[Demo140.java]

    请做一个公司职员薪水管理系统,要求完成如下功能:

    1、当有新员工时,将该员工加入到管理系统

    2、可以根据员工号,显示该员工的信息

    3、可以显示所有员工信息

    4、可以修改员工的薪水

    5、当员工离职时,将该员工从管理系统中删除

    6、可以按照薪水从低到高顺序排序[思考题]

    7、可以统计员工的平均工资和最低和最高工资

    //ArrayList集合类的使用

    //公司职员薪水管理系统

    import java.util.*;

    public class Demo140 {

        public static void main(String[] args) {

            //创建EmpManage对象

            EmpManage em=new EmpManage();

            Scanner sr=new Scanner(System.in);

            //作出一个菜单

            while(true){

                System.out.println("公司职员薪水管理系统");

                System.out.println("1、录入新员工");

                System.out.println("2、根据工号查询信息");

                System.out.println("3、查询所有员工信息");

                System.out.println("4、通过工号修改员工薪水");

                System.out.println("5、删除员工信息");

                System.out.println("6、按薪水高低排序");

                System.out.println("7、计算平均工资及最高()工资");

                System.out.println("0、退出系统");

                System.out.print("请输入对应的数字进行操作:");

                int sel=sr.nextInt();

                if(sel==1){

                    System.out.println("请录入新员工的信息");

                    System.out.print("工号:");

                    String empNo=sr.next();

                    System.out.print("姓名:");

                    String name=sr.next();

                    System.out.print("工资:");

                    float sal=sr.nextFloat();

                    //构建emp对象

                    Emp emp=new Emp(empNo,name,sal);

                    //empNo,name,sal的值传给构造函数Emp

                    em.addEmp(emp);

                    System.out.println("创建新员工"+name+"成功!");

                }else if(sel==2){

                    System.out.println("请录入员工工号:");

                    String empNo=sr.next();

                    em.showInfo(empNo);

                }

                else if(sel==3){

                    System.out.println("公司所有员工信息如下:");

                    em.AllInfo();

                }

                else if(sel==4){

                    System.out.println("请输入工号:");

                    String empNo=sr.next();

                    System.out.println("将工资修改为:");

                    float newSal=sr.nextFloat();

                    em.updateSal(empNo, newSal);

                }

                else if(sel==5){

                    System.out.println("请输入要删除人员的工号:");

                    String empNo=sr.next();

                    em.delEmp(empNo);

                }

                else if(sel==6){

                    System.out.println("已按薪资高低进行排序如下:");

                    em.SortSal();

                }

                else if(sel==7){

                    System.out.println("显示平均工资及最高、最低工资人员信息如下:");

                    em.Average();

                }

                else if(sel==0){

                    System.out.println("已正常退出!");

                    System.exit(0);

                }else{

                    System.out.println("输入错误,请重新输入!");

                }

            }

        }

    }

     

    //创建员工管理类

    class EmpManage{

        private ArrayList<Emp> al=null;

        //创建构造函数,初始化成员变量

        public EmpManage(){

            al=new ArrayList<Emp>();

        }

       

        //加入员工

        public void addEmp(Emp emp){//传入员工信息

            al.add(emp);

        }

       

        //根据员工工号显示员工的相关信息

        public void showInfo(String empNo){//将工号传入showInfo方法中

            //遍历整个ArrayList

            for(int i=0;i<al.size();i++){

                //取出Emp对象

                Emp emp=(Emp)al.get(i);

                //比较编号

                if(emp.getEmpNo().equals(empNo)){//由于empNo类型为String,所以要使用equals进行内容比较,不可以使用==地址比较

                    System.out.println("找到该员工,他的信息是:");

                    System.out.println("工号:"+empNo+" 姓号:"+emp.getName()+" 薪水:"+emp.getSal());

                }else{

                    System.out.println("工号不存在或无此人!");

                }

            }

        }

       

        //显示所有员工信息

        public void AllInfo(){

            for(int i=0;i<al.size()-1;i++){//ArrayList集合类的al大小,控制循环

                for(int j=1;j<al.size()-i;j++){//al中的值进行循环比较

                    Emp emp1=(Emp)al.get(j-1);

                    Emp emp2=(Emp)al.get(j);

    //使用compareTo方法进行Sting类型值比较

                    if(emp1.getEmpNo().compareTo(emp2.getEmpNo())>0){

                        al.set(j,emp1);//交换值并重写入al

                        al.set(j-1,emp2);//交换值并重写入al

                    }

                }

            }

            for(Emp emp:al){

                System.out.println("工号:"+emp.getEmpNo()+" 姓名:"+emp.getName()+" 工资:"+emp.getSal());

            }

        }

       

        //修改员工的薪水

        public void updateSal(String empNo,float newSal){

            //遍历整个ArrayList

            for(int i=0;i<al.size();i++){

                //取出Emp对象

                Emp emp=(Emp)al.get(i);

                if(emp.getEmpNo().equals(empNo)){

                    //修改新水

                    emp.setSal(newSal);//setSal会将修改的薪水传和ArrayList

                    System.out.println("已将"+emp.getName()+"调整为:"+newSal);

                }

            }

            System.out.println("工号不存在或无此人,无法进行相应操作!");

        }

       

        //员工离职删除指定员工

        public void delEmp(String empNo){

            //遍历整个ArrayList

            for(int i=0;i<al.size();i++){

                //取出Emp对象

                Emp emp=(Emp)al.get(i);

                if(emp.getEmpNo().equals(empNo)){

                    //按工号删除

                    al.remove(i);//也可以使用al.remove(emp);

                    System.out.println("已将"+emp.getName()+"信息清除!");

                }

            }

        }

     

        //按薪水高低排序

        public void SortSal(){

            for(int i=0;i<al.size()-1;i++){//ArrayList集合类的al大小,控制循环

                for(int j=1;j<al.size()-i;j++){//al中的值进行循环比较

                    Emp emp1=(Emp)al.get(j-1);

                    Emp emp2=(Emp)al.get(j);

                    if(emp1.getSal()<emp2.getSal()){//比较sal的值大小

                        al.set(j,emp1);//交换值并重写入al

                        al.set(j-1,emp2);//交换值并重写入al

                    }

                }

            }

            for(Emp emp:al){

                System.out.println("工号:"+emp.getEmpNo()+" 姓名:"+emp.getName()+" 工资:"+emp.getSal());

            }

        }

       

        //计算平均工资并找出最高工资和最低工资的员工

        public void Average(){

            float sum=0f,ave=0f;

            //遍历整个ArrayList

            for(int k=0;k<al.size();k++){

                //取出Emp对象

                Emp emp=(Emp)al.get(k);

                sum=emp.getSal()+sum;

            }

            ave=sum/al.size();

            System.out.println("共有员工"+al.size()+" 总工资为:"+sum+" 平均工资为:"+ave);

           

            //找出最高工资与最低式资

            for(int i=0;i<al.size()-1;i++){//ArrayList集合类的al大小,控制循环

                for(int j=1;j<al.size()-i;j++){//al中的值进行循环比较

                    Emp emp1=(Emp)al.get(j-1);

                    Emp emp2=(Emp)al.get(j);

                    if(emp1.getSal()<emp2.getSal()){//比较sal的值大小

                        al.set(j,emp1);//交换值并重写入al

                        al.set(j-1,emp2);//交换值并重写入al

                    }

                }

            }

            for(int i=0;i<al.size();i++){

                if(i==0){

                    Emp emp=(Emp)al.get(i);

                    System.out.println("工资最高的人员是:"+emp.getName()+" 薪水是:"+emp.getSal());

                }else if(i==al.size()-1){

                    Emp emp=(Emp)al.get(i);

                    System.out.println("工资最低的人员是:"+emp.getName()+" 薪水是:"+emp.getSal());

                }

            }

        }

    }

     

    //创建员工类

    class Emp{

        //定义成员变量工号、姓名、薪水

        private String empNo;

        private String name;

        private float sal;

        //创建构造函数,初始化成员变量

        public Emp(String empNo,String name,float sal){

            this.empNo=empNo;

            this.name=name;

            this.sal=sal;

        }

        //使用setget方法进行数据传递

        public String getEmpNo() {

            return empNo;

        }

        public void setEmpNo(String empNo) {

            this.empNo = empNo;

        }

        public String getName() {

            return name;

        }

        public void setName(String name) {

            this.name = name;

        }

        public float getSal() {

            return sal;

        }

        public void setSal(float sal) {

            this.sal = sal;

        }

    }

     
     
     

     
     
     
     





     








  • 相关阅读:
    Python基础学习
    My First Bog
    WPF 自定义窗口,自定义控件和样式
    WPF 数据规则验证
    C# 类的扩展方法
    C# 类的序列化和反序列化
    数据库使用空间查询方法
    关于linux环境下django获取中文url报错处理
    Django中关于csrf_token的认证
    Django + Uwsgi + Nginx 的生产环境部署
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10044292.html
Copyright © 2011-2022 走看看