打赏

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+"\t姓号:"+emp.getName()+"\t薪水:"+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()+"\t姓名:"+emp.getName()+"\t工资:"+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()+"\t姓名:"+emp.getName()+"\t工资:"+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()+"\t总工资为:"+sum+"\t平均工资为:"+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()+"\t薪水是:"+emp.getSal());

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

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

                System.out.println("工资最低的人员是:"+emp.getName()+"\t薪水是:"+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;

    }

}

 
 
 

 
 
 
 





 








posted on 2018-11-30 15:09  XuCodeX  阅读(396)  评论(0编辑  收藏  举报

导航