/*
1 标识符
1.1. 在程序中所定义的一些名称,由26个英文字母大小写,数字0-9,符号:_$组成
1.2 定义合法的标识符规则:
a.数字不可以开头
b.不可以使用关键字
c.Java中严格区分大小写,在起名字时,为了提高阅读性,尽量起有意义的名字。
2 常量与变量
2.1 常量:常量表示不能改变的数值
2.2. Java中的常量分类:
a.整数常量。所有整数
b.小数常量。所有小数
c.布尔型常量。较为特有,只有2个数值。true false
d.字符常量。将一个数字字母或者符号用单引号(‘’)标识。
e.字符串常量。将一个数字字母或者符号用双引号(“”)标识。
f.null常量。只有一个数值就是null
g.对于整数Java有三种表现形式:
a)十进制:0-9满10进1。
b)八进制:0-7满8进1,用0开头表示。
c)十六进制:0-9,A-F,满16进1,用0x表示。
3 进制转换
a.十进制转二进制: 原理:对十进制数进行除2运算
b.二进制转十进制: 原理:二进制乘以2的过程
c.转八进制: 原理:先转换成二进制,在转成八进制,3个代表一位
d.转十六进制: 原理:先转换成二进制,在转成十六进制,4个代表一位(可以做最低四位与运算)
e.负数的二进制表现形式: 原理:将二进制的0变成1,1变成0
============================================================================
例子:-6,在内存中的实际是如下样子的 取反+1 反码是-1取反
-6在内存中的表现形式: 0000-0000 0000-0000 0000-0000 0000-0110
对他进行取反运算: 1111-1111 1111-1111 1111-1111 1111-1001
然后在加1: 0000-0000 0000-0000 0000-0000 0000-0001
---------------------------------------------------
1111-1111 1111-1111 1111-1111 1111-1010 = -6
=============================================================================
f.整数的最高位是0,负数的最高位是1,1是由取反取来的。
4 变量
a.变量:就是将不确定的数据进行存储。也就是需要在内存中开辟一个空间。
例:
*/
class VarDemo
{
public static void main(String[] args)
{
//定义变量的格式:
//数据类型 变量名 = 初始化值
//Or
//数据类型 变量名
//变量名 = 初始化值
}
}
/*
b.数据类型:
byte (number, 1 byte)
short (number, 2 bytes)
int (number, 4 bytes)
long (number, 8 bytes)
float (float number, 4 bytes)
double (float number, 8 bytes)ee
char (a character, 2 bytes)
boolean (true or false, 1 byte)
5 类型转换
a.自动类型转换:
*/
class TypeDemo1
{
public static void main(String[] args)
{
byte b = 3;
b = b + 2;
System.out.println(b);
/*会报错,这是因为JAVA是强类型语言导致的
两个不同类型的数值进行运算会进行自动类型提升,默认是小的类型往大
的转换
*/
}
}
//b.强制类型转换:
class TypeDemo2
{
public static void main(String[] args)
{
byte b = 3;
b = (byte)(b + 2); //这里将b+2的和强制转换成byte类型再赋值给B
System.out.println(b);
}
}
//c.引出的疑问
class TypeDemo3
{
public static void main(String[] args)
{
System.out.println('a' + 1); //打印98,是因为ascii码的原因
System.out.println((char)('a' + 1)) //这里强制转换,打印b
}
}
//6 运算符
//6.1 算术运算符
class OperateDemo1 //算术运算符+-*/
{
public static void main(String[] args)
{
int x = 4270;
x = x / 1000 * 1000;
System.out.println(x); //2个int数据进行运算还是int行,结果为4000
}
}
class OperateDemo2 //取模运算%
{
public static void main(String[] args)
{
System.out.println(10%4); //取模,实际就是取余数,左边小于右边,结果是左边,左边等于右边结果是0,右边是1结果是0
System.out.println(1%-4); //结果等于1
System.out.println(-1%4); //结果等于-1,由以上得出,对一个负数取模,只看左边
}
}
class OperateDemo3 //自曾自减++
{
public static void main(String[] args)
{
int a = 3,b; //定义了2个变量,a初始化值为3,b没有值,不能直接被使用
b = a++; //对a进行+1操作,并把+1后的值重新赋值给a
System.out.println(b); //3
System.out.println(a); //4
System.out.println("a=" + a + ",b=" + b); //利用字符串连接符打印
/*
由上引出的疑问,为什么b是3?
原因是b = a++ 是先把a的值赋值给b然后a再进行++运算
而b = ++a 是先把a的值进行++运算,再赋值给b
*/
}
}
class OperateDemo4 //字符串连接符+
{
public static void main(String[] args)
{
System.out.println("haha" + "haha"); //字符串和任何数据使用+都是相连接,最终都会变成字符串
System.out.println("MyNameIs" + 5 + 5); //打印MyNameIs55,把固定的值放到""里面去,把不固定的用+相连接就可以了
}
}
//6.2 转意字符
class OperateDemo5 //通过\来转变后面字母或者符号的含义
{
public static void main(String[] args)
{
System.out.println("Hello \nWorld!"); //用2行来输出,现在我们想载Hello World中间进行换行那么就在\n
System.out.println("MyNameis Crow!");
System.out.println("\"Hello World!\""); //用\来转意"
/*
\n: 换行
\b: 退格,相当于backspace
\r: 按下回车键,Linux用\r,Windows系统中回车符是由2个字符表示的\r\n
\t: 制表符,相当于tab键
*/
}
}
//6.3 赋值和比较运算符
//a.赋值运算符
class OperateDemo6 // += -= *= /= %=
{
public static void main(String[] args)
{
int x = 3; //把右边赋值给左边
x+=4; //x = x + 4把右边和左边的和赋值给左边,其他同理
}
}
//b.比较运算符
class OperateDemo7 //> < >= <= == !=
{
public static void main(String[] args)
{
if(4 == 3) //相等于,运算完的结果要么是true要么是false
{
System.out.println("true");
}else
{
System.out.println("false");
}
if(4 != 3) //不等于,运算完的结果要么是true要么是false
{
System.out.println("true");
}else
{
System.out.println("false");
}
}
}
//6.4 逻辑运算符
class OperateDemo8 //逻辑运算符用来连接boolean类型的表达式
{
public static void main(String[] args)
{
/*
& And(与)说白了就是并且的意思
无论左边是true还是false,右边都运算
| Or (或)
两边都参与运算
^ Xor(异或)
! Not(非) 取反,一元运算符
&&And(短路)
当左边为false时,右边不运算
||Or (短路)
当左边为true时,右边不运算
int x = 4;
x>3 & x<6 = true & true = true;
true & true = true;
true & false = false;
false & true = false;
false & false = false;
& : 只要两边的boolean表达式结果,有一个为false,结果就为false,只有两边都为true,结果才为true
true | true = true;
true | false = true;
false | true = true;
false | false = false;
| : 只要两边的boolean表达式结果,有一个为true,结果为true,只有两边都为false,结果才为false
true ^ true = false;
true ^ false = true;
false ^ true = true;
false ^ false = false;
^: 就是和|有点不一样,当true ^ true时候为false,两边相同结果为false,两边不同结果是true
*/
}
}
//6.5 位运算符
class OperateDemo9
{
public static void main(String[] args)
{
3<<2 //3左移2位,打印12,最高位原来的值是什么,就补什么
//0000-0000 0000-0000 0000-0000 0000-0011
//0000-0000 0000-0000 0000-0000 0000-1100 左移以后为12,左移就是乘以2的n次方
6>>2 //6又移2位
//0000-0000 0000-0000 0000-0000 0000-0110
//0000-0000 0000-0000 0000-0000 0000-0001 //右移以后为1,右移就是除以2的n次方
//>>> 无符号右移,不管最高位原来值是什么,都拿0补齐
}
}
class OperateDemo10
{
public static void main(String[] args)
{
/*
6 & 3 = 2 //只要一边为false,结果就为false
110 0 代表false
&011 1 代表true
-----
010 = 2
6 | 5 = 7 //只要一边为true,结果就为true
110
|101
----
111 = 7
6 ^ 5 = 3 //两边相同为false
110
^101
----
011 = 3
~ //反码,就是二进制-1再取反
System.out.println(~6); //-7
*/
}
}
class OperateDemo11 //简单的思考,有趣的问题
{
public static void main(String[] args)
{
/*
7 ^ 4 ^ 4= 7
111
^100
---
011
^100
---
111 = 7 //7^4^4结果=7
//一个数异或同一个数2次,结果还是那个数,这个特性可以用来做简单的加密
*/
}
}
//6.6 位运算符练习
//a.对2乘以8进行运算
//a)因为是2的倍数,最有效的方式是用<<运算。
//b.对两个整数的值进行互换
class OperateDemo12
{
public static void main(String[] args)
{
int n = 3, m = 8;
//1通过第三方变量
int temp;
temp = n;
n = m;
m = temp;
//2不用第三方变量,如果n和m的值非常大,容易超出int范围
n = n + m; //n = 11
m = n - m; //m = 3
n = n -m //n = 8
n = n ^ m;
m = n ^ m; //(n^m)^m
n = n ^ m; //n^(n^m)
}
}
/*
6.7 三元运算符
格式:
(条件表达式)?表达式1:表达式2
如果条件结果为true,那么执行表达式1
如果条件结果为false,那么执行表达式2
三元运算符:
好处:可以简化代码
弊端:因为是一个运算符,所以运算为必须要有一个结果
*/
class OperateDemo13
{
public static void main(String[] args)
{
int x = 3,y;
y = (x>1)?100:200; //如果x的值>1那么把100赋值给y,如果<=1那么把200赋值给y
System.out.println(y);
}
}
//7 流程控制语句
//7.1 判断结构
//if 有3种形式
//a)
class IfDemo1
{
public static void main(String[] args)
{
int x = 3;
if(x>1)
{
System.out.println("Yes");
}
System.out.println("Over"); //这里无论If是否满足都执行,因为此句不再if控制区间内
}
}
//b)
class IfDemo2
{
public static void main(String[] args)
{
int x = 3;
if(x>1)
{
System.out.println("Yes");
}else
{
System.out.println("No"); //这里受else控制
}
}
}
//c)
class IfDemo3
{
public static void main(String[] args)
{
int x = 3;
if(x>1)
{
System.out.println("x > 1");
}else if (x == 1){
System.out.println("x == 1");
}else{
System.out.println("No");
}
}
}
/*
7.2 选择结构
缺点:if能够判断区间,case不能,因为要判断区间必须把值全写出来,很费劲
switch不能判断boolean值的类型
switch(表达式) //表达式的值只能是4种类型byte short int char
{
case 取值1: //case和default的顺序是随意的,但是执行是从case开始的
执行语句;
break;
case 取值2:
执行语句;
break;
......
default:
执行语句;
break; //语句可以从break跳出,也可以从}结束
}
*/
//a)
class SwitchDemo1
{
public static void main(String[] args)
{
int x = 2;
switch(x)
{
case 1:
System.out.println("1");
break;
case 2:
System.out.println("2");
break;
case 3:
System.out.println("3");
break;
case 4:
System.out.println("4");
break;
default:
System.out.println("default");
break; //最后这个break可以省略
}
}
}
//b)
class SwitchDemo2
{
public static void main(String[] args)
{
//需求,根据用户指定月份,打印该月份所属的季节
//3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12 1 2 冬季
int x = 4;
switch(x)
{
case 3:
case 4:
case 5:
System.out.println(x + "月是春季");
break;
case 6:
case 7:
case 8:
System.out.println(x + "月是夏季");
break;
case 9:
case 10:
case 11:
System.out.println(x + "月是秋季");
break;
case 12:
case 1:
case 2:
System.out.println(x + "月是冬季");
break;
default:
System.out.println("NoNo");
}
}
}
/* switch应用场景:如果判断的具体数值不多,而且符合byte short int char这四种类型,虽然两个语句都
可以使用,建议使用switch语句,因为效率稍高。
其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广
*/
/*
7.3 循环结构
循环语句的特点:当一个语句需要循环很多次的时候使用,while或者for语句
只是考虑变量的作用域问题
a.while语句
定义初始化表达式
while(条件表达式)
{
执行语句;
}
*/
//a)
class WhileDemo1
{
public static void main(String[] args)
{
int x = 1;
while(x < 3) //条件满足,执行控制区间中的语句
{
System.out.println("Hello World!"); //打印2次
x++;
}
}
}
/*
b.do while语句
定义初始化表达式
do
{
执行语句;
}
while(条件表达式); //do while最后判断条件,也就意味着do while无论如何都会执行至少一次
*/
//a)
class WhileDemo2
{
public static void main(String[] args)
{
int x =1;
do
{
System.out.println("Hello World!"); //打印2次
x++;
}
while(x < 3);
}
}
//b)while无限循环最简单的表现形式
class WhileDemo3
{
public static void main(String[] args)
{
while(true){}
}
}
/*c.for语句
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
*/
//a)
class ForDemo1
{
public static void main(String[] args)
{
for(int x = 0; x<3; x++)
{
System.out.println("Hello World!");
}
}
}
/*
for和while的区别:
for的变量作用域范围只能载for语句中有效,那么对于变量来讲,如果这个变量只作用与循环的增量
来存在的话,那么建议使用for
*/
//b)
class ForDemo2
{
public static void main(String[] args)
{
int x = 1;
for(System.out.println("a"); x<3; System.out.println("c")) //疑问,有结果吗?结果是什么?
{
System.out.println("d");
x++;
}
}
}
//由上可只for必须要有真假,不要一位写for循环就一定要写int x = 1;只要是合法的表达式就可以
//c)
class ForDemo3
{
public static void main(String[] args)
{
int x = 1;
for(System.out.println("a"); x<3; System.out.println("c"),x++) //多个表达式出现的时候用,分开就可以了
{
System.out.println("d");
}
}
}
//d)for无限循环最简单的表现形式
class ForDemo4
{
public static void main(String[] args)
{
for(;;){} //对于for来讲,如果不写循环条件表达式,默认为true
}
}
//e)获取1~10的和,并打印
//e.a)利用while循环来实现
class ForDemo4
{
public static void main(String[] args)
{
int sum = 0;
int x = 1;
while(x <= 10)
{
sum = sum + x;
x++;
}
System.out.println("sum= " + sum);
}
}
//e.a)利用for循环来实现
class ForDemo5
{
public static void main(String[] args)
{
int sum = 0;
for(int x = 1; x <= 10; x++)
{
sum += x;
}
System.out.println("sum= " + sum);
}
}
//e)for语句嵌套
class ForDemo6
{
public static void main(String[] args)
{
for(int x = 0; x < 3; x++)
{
for(int y = 0; y < 4; y++) //此循环体结束后才会执行父循环体
{
System.out.println("ok");
}
}
}
}
//7.4 其他流程控制语句
//a.break(跳出)
class BreakDemo1
{
public static void main(String[] args)
{
for(int x = 0; x<3; x++)
{
System.out.println("x= " + x);
break; //跳出,这时候循环语句就结束了,break只能跳出当前循环
}
}
}
class BreakDemo2
{
public static void main(String[] args)
{
w:for(int x = 0; x<3; x++) //这里可以给for循环加标记
{
for(int y = 0; y<4; y++)
{
System.out.println("x= " + x);
break w; //这里跳转到指定标记
}
}
}
}
//b.continue(继续)
class ContinueDemo1
{
public static void main(String[] args)
{
for(int x = 0; x<3; x++)
{
if(x%2==1)
{
continue; //continue结束本次循环,继续下一次循环,continue也可以加标记
}
System.out.println("x= " + x);
}
}
}
/*
8 函数
8.1 什么是函数?
函数就是定义在类中的具有特定功能的一段独立小程序。
函数也称为方法
8.2 函数的格式:
修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2, ...)
{
执行语句;
return 返回值;
}
返回值类型: 函数运行后的结果的数据类型
参数类型: 是形式参数的数据类型
形式参数: 是一个变量,用于存储调用函数时传递给函数的实际参数
实际参数: 传递给形式参数的具体数值
return: 用于结束函数
返回值: 该值会返回给调用者
8.3 example:
*/
//a.需要定义一个功能,打印x*3+5
class FunctionDemo1
{
public static void main(String[] args)
{
int x = getResult(4); //这里调用函数
}
public static int getResult(int x) //函数定义在类中,被调用才执行
{
return x * 3 + 5;
}
}
/*
8.4 函数的特点
定义函数可以将功能代码进行封装,便于对该功能进行复用
函数只有被调用才会执行
函数的出现提高了代码的复用性
对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的
return语句如果在最后一行可以省略不写
注意:
函数中只能调用函数,不可以在函数内部定义函数
定义函数时,函数结果应该返回给调用者,交由调用者处理
8.5 没有具体返回值的情况
a.//void练习,当函数没有返回值的时候,return可以不写
*/
class FunctionDemo2
{
public static void main(String[] args)
{
getResult(4); //这里调用函数
}
public static void getResult(int x) //当函数运算后没有具体的返回值时,这是返回值类型用void来标识
{
System.out.println(x * 3 + 5;);
}
}
/*
8.6 函数的重载
在同一个类中,允许存在一个以上同名函数,只要它们的参数个数或者参数类型不同即可重载
重载示例:
//返回两个整数的和
int add(int x, int y){return x+y;}
//返回三个整数的和
int add(int x,int y,int z)return x+y+z;}
//返回两个小数的和
double add(double x,double y){return x+y;}
9 数组
9.1 数组的定义:同一种类型的数据的集合,其实数组就是一个容器
9.2 数组的好处:可以自动的给数组中的元素从0开始编号,方便操作这些元素
9.3 数组的格式:
a.格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例: int[] arr = new arr[5];
b.格式2:
元素类型[] 数组名 = new 元素类型[]{元素1,元素2,......};
示例: int[] arr = new arr[]{3,5,1,7};
int[] arr = {3,5,1,7};
9.4 example:
*/
//a.
class ArrayDemo1
{
public static void main(String[] args)
{
//需求,想定义一个可以存储3个整数的容器
int[] x = new int[2];
x[0] = 4;
x[1] = 6;
System.out.println(x[0]);
System.out.println(x[1]);
}
}
//9.5 数组操作常见的问题
//b.
class ArrayDemo2
{
public static void main(String[] args)
{
//Java中常见的错误
int[] arr = new int[3];
System.out.println(arr[3]); //这里编译不会报错,在运行的时候会报错
}
}
//c.
class ArrayDemo3
{
public static void main(String[] args)
{
int[] arr = new int[3];
arr = null; //这里把引用置空
System.out.println(arr[1]); //编译时不会报错,当程序执行到这里是报错
}
}
//9.6 数组的常见操作
/*
a.数组的遍历
获取数组的元素,通常利用for循环来解决
*/
class ArrayDemo4
{
public static void main(String[] args)
{
int[] arr = new int[]{22,412,23,441}; //这里一个一个数比较麻烦,载数组中有一个属性可以直接获取到数组元素的个数。length
//使用方法:数组名称.length =
for(int x=0; x<arr.length; x++)
{
System.out.println("arr["+x+"]="+arr[x]";");
}
}
}
//定义功能:打印数组中的元素,元素之间用逗号隔开.
class ArrayDemo5
{
public static void main(String[] args)
{
int[] arr = new int[4];
arr[0] = 32;
arr[1] = 47;
arr[2] = 76;
arr[3] = 51;
printArray(arr);
}
public static void printArray(int[] arr)
{
for(int x=0; x<arr.length; x++)
{
if(x!=arr.length-1)
{
System.out.print(arr[x] + ",");
}else
{
System.out.println(arr[x]);
}
}
}
}
//给定一个数组{2,1,5,8,3,0,7},获取数组中的最大值,最小值
class ArrayDemo6
{
public static void main(String[] args)
{
int[] arr = new int[]{2,1,5,8,3,0,7};
/*
1.获取最值需要进行比较,每次比较都会有一个较大的值,因为该值不确定,那么通过变量进行临时存储
2.让数组中每一个元素都和这个变量中的值进行比较,如果大于变量中的值,就用该变量记录较大的值。
3.当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值。
*/
int max = getMax(arr);
System.out.println("max = " + max);
}
public static int getMax(int[] arr)
{
int max = arr[0];
for(int x=1; x<arr.length; x++)
{
if(arr[x]>max)
{
max = arr[x];
}
}
return max;
}
}
//思考:可不可以将临时变量初始化为0呢?
class ArrayDemo7
{
public static void main(String[] args)
{
int[] arr = new int[]{2,1,5,8,3,0,7};
int max = getMax(arr);
System.out.println("max = " + max);
}
public static int getMax(int[] arr)
{
//int max = arr[0];
int max = 0 //这里把它初始化为0,是可以的,因为是把它看成初始化为数组中任意一个下标
for(int x=1; x<arr.length; x++)
{
if(arr[x]>arr[max])
{
max = x;
}
}
return arr[max]; //这里返回数组是max下标的元素
}
}
//获取最小值,作为练习
/*
数组的排序
a.选择排序
*/
class ArrayDemo8
{
public static void SelectSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
for(int y=x+1; y<arr.length; y++)
{
if(arr[x]>arr[y])
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
public static void printArray(int[] arr)
{
for(int x=0; x<arr.length; x++)
{
if(x!=arr.length-1)
{
System.out.println("Arr[]={" + arr[x] +"},");
}else
{
System.out.println("Arr[]={" + arr[x] +"}");
}
}
}
public static void main(String[] args)
{
int[] arr = new int[]{1,5,3,6,8,7,0,9,2};
System.out.println("=============排序前=================");
printArray(arr);
System.out.println("=============排序后=================");
SelectSort(arr);
printArray(arr);
}
}
/*
数组的排序
b.冒泡排序
*/
class ArrayDemo9
{
public static void BubbleSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
for(int y=0; y<arr.length-x-1; y++)
{
if(arr[y]>arr[y+1])
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
public static void printArray(int[] arr)
{
for(int x=0; x<arr.length; x++)
{
if(x!=arr.length-1)
{
System.out.println("Arr[]={" + arr[x] +"},");
}else
{
System.out.println("Arr[]={" + arr[x] +"}");
}
}
}
public static void main(String[] args)
{
int[] arr = new int[]{1,5,3,6,8,7,0,9,2};
System.out.println("=============排序前=================");
printArray(arr);
System.out.println("=============排序后=================");
BubbleSort(arr);
printArray(arr);
}
}
/*
数组的排序
c.封转位置置换功能
*/
class ArrayDemo10
{
public static void main(String[] args)
{
}
public static void swap(int[] arr,int a,int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
//数组的查找
class ArrayDemo11
{
public static void main(String[] args)
{
int[] arr = new int[]{1,5,3,6,8,7,0,9,2};
int index = getIndex(arr,3);
System.out.println("index=" + index);
}
//定义功能:获取key第一次出现在数组中的位置,如果返回值是-1,那么代表该key在数组中不存在.
public static int getIndex(int[] arr,int key)
{
for(int x=0; x<arr.length; x++)
{
if(arr[x]==key)
return x;
}
return -1;
}
}
//a.折半查找
class ArrayDemo12
{
public static void main(String[] args)
{
int[] arr = new int[]{1,3,5,6,7,8,9};
int index = halfSearch(arr,7);
System.out.println("index=" + index);
}
//折半查找,可以提高效率,但是必须要保证该数组是有序的数组.
public static int halfSearch(int[] arr,int key)
{
int max,mid,min;
min = 0;
max = arr.length-1;
mid = (max+min)/2;
while(arr[mid]!=key)
{
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
if(min>max)
return -1;
mid = (max+min)/2;
}
return mid;
}
}
//b.折半查找的第二种方式
class ArrayDemo13
{
public static void main(String[] args)
{
int[] arr = new int[]{1,3,5,6,7,8,9};
int index = halfSearch_2(arr,7);
System.out.println("index=" + index);
}
//折半查找,可以提高效率,但是必须要保证该数组是有序的数组.
public static int halfSearch_2(int[] arr,int key)
{
int min = 0,max = arr.length-1,mid;
while(min<=max)
{
mid = (max+min)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -1;
}
}
//利用程序进行进制转换
//a.第一种方法
class ToBin1
{
public static void main(String[] args)
{
toBin(6);
}
//十进制转二进制
public static void toBin(int num)
{
while(num>0)
{
System.out.println(num%2);
num = num / 2;
}
}
}
//b.第二种方法
class ToBin2
{
public static void main(String[] args)
{
toBin(6);
}
//十进制转二进制
public static void toBin(int num)
{
StringBuffer sb = new StringBuffer(); //利用StringBuffer方法进行存储
while(num>0)
{
sb.append(num%2);
num = num / 2;
}
System.out.println(sb.reverse());
}
}
//十进制转十六进制
class ToBin3
{
public static void main(String[] args)
{
toHex(60);
}
public static void toHex(int num)
{
for(int x=0; x<8; x++)
{
int temp = num & 15;
if(temp>9)
System.out.println((char)(temp-10+'A'));
else
System.out.println(temp);
num = num >>> 4;
}
}
}
/*
查表法
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
将所有元素临时存储起来,建立对应关系。每一次&15后的值作为索引
去查建立好的表。就可以找到对应的元素,这样就比-10+'a'简单的多
通过数组的形式建立表
*/
class ToBin4
{
public static void main(String[] args)
{
toHex(60);
}
public static void toHex(int num)
{
char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
for(int x=0; x<8; x++)
{
int temp = num & 15;
System.out.println(chs[temp]);
num = num >>> 4;
}
}
}
//对结果还是不满意,我们需要只显示有效位,并且反转结果
class ToBin5
{
public static void main(String[] args)
{
toHex(60);
}
public static void toHex(int num)
{
char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//定义一个临时数组,用于反转结果
char[] arr = new char[8];
int pos = arr.length;
while(num!=0)
{
int temp = num & 15;
arr[--pos] = chs[temp];
num = num >>> 4;
}
//存储数据的arr数组遍历
for(int x=pos; x<arr.length; x++ ) //这里数组指针倒着存
{
System.out.print(arr[x] + ",");
}
}
}
转载于:https://blog.51cto.com/coroot/1599314