Character.digit()的意义

本文深入解析了Java中Character.digit()方法的功能与使用,包括如何根据指定基数转换字符,以及方法的边界值判断特性。通过具体示例,展示了数字字符在不同基数下的转换效果,以及非数字字符和越界情况的处理。

官方说法是:

java.lang.Character.digit(char ch, int radix)方法:

在指定的基数返回字符ch的数值。如果基数是不在范围内MIN_RADIX≤基数≤MAX_RADIX或如果该值的通道是不是一个有效的数字在指定的基数-1,则返回。以下是如果至少有一个字符是一个有效的数字:

  • 方法isDigit为true的字符和Unicode字符的十进制数值(或分解的单字符)小于指定的基数。在这种情况下的十进制数字值被返回。

  • 该字符是一个大写拉丁字母'A'到'Z'和它的代码是小于基数+'A' - 10。在这种情况下,ch - 'A'+10返回。

  • 字符的小写拉丁字母'a'到'z'和它的代码小于radix+'A' - 10。在这种情况下,ch - 'a'+10返回。

  • 字符是一个全角大写拉丁字母A('\ uFF21')到Z('\ uFF3A“)和它的代码小于radix+'\ uFF21” - 10。在这种情况下,ch - '\ uFF21'+ 10返回。

  • 该字符是一个小写拉丁字母的全角('\ uFF41')到Z('\ uFF5A“),且它的代码小于radix+'\ uFF41” - 10。在这种情况下,ch - '\ uFF41'+10返回。

以下是java.lang.Character.digit()方法的声明

public static int digit(char ch, int radix)
public static int digit(int ch, int radix)

其中:

  1. ch - the character to be converted(要转换的字符)
    1.1 ch - int类型,是字符的ASCII码,数字的ASCII码是48-57

  2. radix - the radix(基数) ----也就是进制数

返回值
此方法返回由指定基数中的字符表示的数值。

digit的源码在下面:

int digit(int ch, int radix) {
        int value = -1;
        if (radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) {
            int val = getProperties(ch);
            int kind = val & 0x1F;
            if (kind == Character.DECIMAL_DIGIT_NUMBER) {
                value = ch + ((val & 0x3E0) >> 5) & 0x1F;
            }
            else if ((val & 0xC00) == 0x00000C00) {
                // Java supradecimal digit
                value = (ch + ((val & 0x3E0) >> 5) & 0x1F) + 10;
            }
        }
        return (value < radix) ? value : -1;
    }

注意这个方法只能返回数字字符的值,而且是在radix这个基数范围内,若数字字符超过这个基数则返回 -1,若字符不是数字,也返回 -1。

通俗理解:digit()是个边界值判断,不过边界返回字符数字本身数值,超过边界即返回 -1

测试:

  1. 数字字符情况:
public static void main(String[] args) {
        int digit = Character.digit('6', 8);
        System.out.println("digit = " + digit);
    }

/**result:
*digit = 6
*/
  1. 数字字符越界情况:
public static void main(String[] args) {
        int digit = Character.digit('6', 2);
        System.out.println("digit = " + digit);
    }

/**result
*digit = -1
*/
  1. 其他字符情况:
public static void main(String[] args) {
        int digit = Character.digit('d', 2);
        System.out.println("digit = " + digit);
    }

/**
*digit = -1
*/
  1. ASCII码情况
 public static void main(String[] args) {
        int digit = Character.digit(51, 6);//正常
        int digit2 = Character.digit(50,2);//越界
        int digit3 = Character.digit(47,2);//非数字ASCII码
        System.out.println("digit = " + digit);
        System.out.println("digit2 = " + digit2);
        System.out.println("digit3 = " + digit3);
    }

/*result:
digit = 3
digit2 = -1
digit3 = -1
*/

基本会用了,接着去看parseInt()啦_

Integer.parseInt(str,16);

(2)简单的词法分析程序设计 1、实现的基本原理: 利用单词描述工具(文法、自动机及它们之间的关系)进行单词解析。 2、实验内容 (1)掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 (2)掌握词法分析的实现方法。 (3)上机调试编出的词法分析程序,不限于C语言。 (4)为简单起见,假设编译语言为具有下特征的C_minus。该词法分析器要求至少能够识别C_minus中的以下几类单词: a. 关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写; b. 标识符:识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*; c. 常数:NUM=(+ | - |ε)digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整数,如123, -123, +123等;小数,如123.45, +123.45, -123.45;科学计数法表示的常数,如+1.23e3,-2.3e-9; d. 专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */; 参考代码: import java.util.regex.*; public class Lexer { public enum TokenType { KEYWORD, IDENTIFIER, NUMBER, SYMBOL, ERROR } public static class Token { public final TokenType type; public final String lexeme; public Token(TokenType type, String lexeme) { this.type = type; this.lexeme = lexeme; } @Override public String toString() { return "<" + type + ", " + lexeme + ">"; } } public static Token lex(String input) { String pattern = "\\s*(?<KEYWORD>else|if|int|return|void|while)" + "|(?<IDENTIFIER>[a-zA-Z][a-zA-Z0-9]*)" + "|(?<NUMBER>[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)" + "|(?<SYMBOL>[+\\-*/<>=!;,\\[\\]{}()])" + "|(?<ERROR>.+)"; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(input); if (m.matches()) { if (m.group("KEYWORD") != null) { return new Token(TokenType.KEYWORD, m.group("KEYWORD")); } else if (m.group("IDENTIFIER") != null) { return new Token(TokenType.IDENTIFIER, m.group("IDENTIFIER")); } else if (m.group("NUMBER") != null) { return new Token(TokenType.NUMBER, m.group("NUMBER")); } else if (m.group("SYMBOL") !=
03-19
实验目的 编制一个词法分析程序,从输入的源程序中,识别出各个具有独立意义的单 词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单 词的内部编码及单词符号(遇到错误时可显示“Error”,然后跳过错误部分继 续显示),使学生掌握词法分析器的基本原理。 五、实验要求 利用词法分析原理,以独立子程序的方式,实现对小型 C 语言程序进行词法 分析,识别相应的单词符号。 六、实验内容 (一)准备 1. 阅读课本有关章节,明确语言的语法,写出基本保留字、标识符、常数、 运算符、分隔符和测试程序例。 2. 初步编制好程序。 3. 准备好多组测试数据。 (二)定义目标语言的可用符号表和构词规则 5 1. 依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束; 2. 对正确的单词,按照它的种别以<种别码,值>的形式保存在符号表中; 3. 对不正确的单词,做出错误处理。 (三)状态转换图见教材。 (四)流程图 6 (五)程序要求 独立子程序。 程序示例:根据自己所写词法分析程序给出 C 语言编码,要求输出格式为 二元组形式:(种别编码,属性)。 程序思路(仅供参考): 1.定义部分:定义常量、变量、数据结构。 2.初始化:从文件将源程序全部输入到字符缓冲区中。 3.让每个状态结点对应一小段程序 (1)character:字符变量,存放最新读入的源程序字符。 (2)token:字符数组,存放构成单词符号的字符串。 (3)getbe( ):若 character 中的字符为空白,则调用 getchar( ),直 至 character 为非空白字符为止。 7 (4)concatenation( ):将 token 中的字符串与 character 中的字符连接 并作为 token 中新的字符串。 (5)letter( )和 digit( ):判断 character 中的字符是否为字母和数字 的布尔函数,是则返回 true,否则返回 false。 (6)reserve( ):按 token 数组中的字符串查表 2.1 中的前五项(即判别 其是否为保留字),若是保留字则返回它的编码,否则返回 0 值。 (7)retract( ):扫描指针回退一个字符,同时将 character 置为空白。 (8) buildlist( ):将标识符登录到符号表中或将常数登
05-10
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值