热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java笔记(一)编程基础与二进制

编程基础与二进制一、编程基础函数调用的基本原理:函数调用中的问题:1)参数如何传递?2)函数如何知道返回什么地方?3)函数结果如何传递给调用方?解决思路是使用内存来函

编程基础与二进制

一、编程基础

函数调用的基本原理:

函数调用中的问题:

1)参数如何传递?

2)函数如何知道返回什么地方?

3)函数结果如何传递给调用方?

解决思路是使用内存来函数调用过程中需要的数据,这种内存叫做栈。栈是一种先进后出的内存,栈底内存地址最高,栈顶最低。

另外,函数返回值一般使用一种特殊的栈--CPU内的存储器来存储。main函数的相关数据放在栈底,每调用一次函数,都会将函数

的相关数据入栈,调用结束就出栈。举个例子:

public class Sum {

    public static int sum(int a, int b) {
        int c = a + b;
        return c;
    }
    
    public static void main(String[] args) {
        int d = Sum.sum(1, 2);
        System.out.println(d);
    }
}

1.调用Sum.sum()方法前栈的情况:

2.在程序执行到sum()函数内部,返回前,栈的情况:

函数的参数和函数内定义的变量,都分配在栈中,这些变量在函数被调用的时候才分配,

而且在调用结束后就被释放了,但这种说法主要针对基本数据类型。

数组和对象的内存分配:

public class ArrayMax {
    public static int max(int min, int[] arr) {
        int max = min;
        for(int a : arr) {
            if (a > max) {
                max = a;
            }
        }
        return max;
    }
    public static void main(String[] args) {
        int[] arr = new int[]{2, 3, 4};
        int ret = max(0, arr);
        System.out.println(ret);
    }
}

在程序执行到max函数调用return语句之前:

当main函数执行结束,栈空间没有变量指向堆中的内容时,Java系统会自动进行垃圾回收,释放该空间。

 二、理解数据背后的二进制

整数的二进制表示:

二进制使用最高位表示符号位,用1表示负数,用0表示正数。但哪个高位?

整数有4种类型byte,short,int,long分别占用1,2,4,8个字节,即分别占用

8,16,32,64位,每种类型的符号位都是最左边的那一位。

但是,负数的表示不是简单的把最高位变为1。而是使用补码表示法来表示。

补码:就是在原码的基础上取反然后加上1。例如:

1)-1:1的原码是0000 0001,取反为1111 1110再加上1后是1111 1111。

2)-2:2的原码是0000 0010,取反为1111 1101再加上1后是1111 1110。

3)-127:127的原码是0111 1111 ,取反为1000 0000再加上1后是1000 0001。

给定一个负数的二进制表示,想要知道它的十进制值,可以采用相同的补码运算。

比如-2,原码为1111 1110,取反为0000 0001,再加上1,得到0000 0010,就是

十进制的2。

思考:为什么会采用补码再加1这种奇怪的方式表示负数?(提示:计算机只能做加法)。

整数的十六进制表示:

为什么要使用十六进制?因为二进制写出来一长串啊,弟弟。

用法:可以使用十六进制直接写数字常量,在数字前加0x就行了。10到15用A到F表示。

注意:Java7以后也可以使用二进制数字常量,在数字前面加0b或者0B就行了。

位运算

1.移位:

1)左移:操作符为<<,向左移动,右边低位补0,高位舍弃。左移1位,相当于该数十进制乘以2(同时适用于正数和负数)。

2)无符号右移:操作符>>>,向右边动,右边舍弃掉,左边补0,相当于十进制除以2(仅适用于正数)。

3)有符号右移:操作符>>,向右边动,右边舍弃掉,左边补什么取决于原来最高位是什么,原来

是1就补1,原来是0就补0,右移1位相当于除以2(适用于正负数)。

2.按位与---&:

先将两个数据转化为二进制数,然后按位进行与运算,同为1结果为1,其它情况结果为0

用途:

1)清零

2)取一个数种的指定位

3)判断奇偶性:任意数与1取位与,结果1的为奇数

3.按位或-----|

先将两个数据转化为二进制数,然后进行按位或运算,只要有一个是1结果为1,不然结果为0

 

用途:

4.按位异或----^ 

先将两个数据转化为二进制数,然后进行按位异或运算,只要位不同结果为1,不然结果为0

用途:

二进制、十进制与十六进制之间的转换

1)二进制转十进制

1010 = 0*2+ 1*21 + 0*22 + 1*23

2)二进制转十六进制

从左到右4个数为一个单位,不足4位补0:

0010 1100 ----> 2 22+2----> 2C

3)十进制转二进制

除以2取余法:

123  -----  1

61   -----  1

30   -----  0

15   -----  1

7    -----  1

3    -----  1

1    -----  1

0   

结果为: 11 1101 

4)十进制转十六进制

除16取余法:

188

11 ---- 12

0  ---- 11

AB

5)十六进制转二进制

十六进制数通过除2取余法,得到二进制数,对每个十六进制为4个二进制,不足时在最左边补零。

6)十六进制转十进制

 AB =  11*161 + 12*160

小数的二进制表示:

小数计算为什么会出错?

实际上,不是运算本身会出错而是计算机根本就没办法精确地表示很多数。

比如0.1,其实这跟十进制不能精确表示1/3是一个道理。二进制只能表示

那些可以表述为2的多次方和的数。

字符的编码与乱码:

编码有两大类:一是非Unicode编码,一类是Unicode编码。

非Unicode编码:

1)ASCII:规定了0~127的每个数字代表的意义。

2)其他:ISO 8859-1,Windows-1252,GB2312,GBK,GB18030,Big5

其中ASCII是基础,其他编码方式兼容ASCII。

Unicode编码:

Unicode主要做了一件事,就是给世界上所有字符分配了唯一的数字编号。

但是要注意,它并没有规定这些数字编号怎么对应到具体的二进制表示,这与其他的编码不同,

具体怎么对应是由UTF-32,UTF-16,UTF-8这几种编码方案确定的。具体对应方式:

1)UTF-32:字符编号的整数二进制形式,4个字节。缺点:浪费空间。

2)UTF-16:常用字符集用两个字节表示,增补字符集用4个字节表示。

3)UTF-8:使用变长字节表示,每个字符使用的字节个数与其Unicode编号相关,字节数1-4个不等(小于128的与ASCII一样)。

乱码的原因:

1)解析错误

2)在解析错误的基础上进行了编码转换

char的真正含义:

在Java内部进行字符处理时,采用的是UTF-16BE。

char本质上是一个固定占用两个字节的无符号正整数,这个正整数对应Unicode编号,

用于表示那个Unicode编号表示的字符。char的赋值方式:

char a = \'A\';
char b = \'唐\';
char c = 23235;
char d = 0x66;
char e = \'\u9a6c\';

直接写字符常量的时候应该注意文件的编码,比如,GBK编码的源码文件

按UTF-8打开,字符会变成乱码,赋值的时候是按照当前的编码解读方式

,将这个字符形式对应的Unicode编号赋值给变量。


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
女院外语系10级商务英语一班
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有