取得汉语拼音首个字母

byte数组转float 以及byte转其他类型时为什么要&0xff

public static float getFloat(byte[] b) {

int accum = 0;

accum = accum|(b[0] & 0xff) << 0;

accum = accum|(b[1] & 0xff) << 8;

accum = accum|(b[2] & 0xff) << 16;

accum = accum|(b[3] & 0xff) << 24;

System.out.println(accum);

return Float.intBitsToFloat(accum);

}

java中byte转换int时为何与0xff进行与运算

在剖析该问题前请看如下代码

public static String bytes2HexString(byte[] b) {

String ret = "";

for (int i = 0; i < b.length; i++) {

String hex = Integer.toHexString(b[i] & 0xFF);

if (hex.length() == 1) {

hex = ‘‘0‘‘ + hex;

}

ret += hex.toUpperCase();

}

return ret;

}

上面是将byte[]转化十六进制的字符串,注意这里b[i] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出

b[i] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[i]);,将byte强转为int不行吗?答案是不行的.

其原因在于:

1.byte的大小为8bits而int的大小为32bits

2.java的二进制采用的是补码形式

在这里先温习下计算机基础理论

byte是一个字节保存的,有8个位,即8个0、1。

8位的第一个位是符号位,

也就是说0000 0001代表的是数字1

1000 0001代表的就是-1

所以正数最大位0111 1111,也就是数字127

负数最大为1111 1111,也就是数字-128

上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码

1、反码:

一个数如果是正,则它的反码与原码相同;

一个数如果是负,则符号位为1,其余各位是对原码取反;

2、补码:利用溢出,我们可以将减法变成加法

对于十进制数,从9得到5可用减法:

9-4=5    因为4+6=10,我们可以将6作为4的补数

改写为加法:

9+6=15(去掉高位1,也就是减10)得到5.

对于十六进制数,从c到5可用减法:

c-7=5    因为7+9=16 将9作为7的补数

改写为加法:

c+9=15(去掉高位1,也就是减16)得到5.

在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(1 0000 0000),进位1被丢弃。

⑴一个数为正,则它的原码、反码、补码相同

⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1

- 1的原码为                1000 0001

- 1的反码为                1111 1110

+ 1

- 1的补码为                1111 1111

0的原码为                 0000 0000

0的反码为                 1111 1111(正零和负零的反码相同)

+1

0的补码为               10000 0000(舍掉打头的1,正零和负零的补码相同)

Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位。

例如补码1111 1111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。和0xff相与后,高24比特就会被清0了,结果就对了。

了解这个基础后回归正题:

public static String getPinYinHead(char c) {
        String s = String.valueOf(c);

        byte[] b;
        try {
            b = s.getBytes("GBK");
        } catch (UnsupportedEncodingException e) {
            b = s.getBytes();
        }

        if (b.length >= 2) {
            int b1 = b[0] & 0xff;
            int b2 = b[1] & 0xff;

            int value = b1 << 8 | b2;
            if (value >= 0xb0a1 && value <= 0xb0c4) {
                return "A";
            } else if (value >= 0xb0c5 && value <= 0xb2c0) {
                return "B";
            } else if (value >= 0xb2c1 && value <= 0xb4ed) {
                return "C";
            } else if (value >= 0xb4ee && value <= 0xb6e9) {
                return "D";
            } else if (value >= 0xb6ea && value <= 0xb7a1) {
                return "E";
            } else if (value >= 0xb7a2 && value <= 0xb8c0) {
                return "F";
            } else if (value >= 0xb8c1 && value <= 0xb9fd) {
                return "G";
            } else if (value >= 0xb9fe && value <= 0xbbf6) {
                return "H";
            } else if (value >= 0xbbf7 && value <= 0xbfa5) {
                return "J";
            } else if (value >= 0xbfa6 && value <= 0xc0ab) {
                return "K";
            } else if (value >= 0xc0ac && value <= 0xc2e7) {
                return "L";
            } else if (value >= 0xc2e8 && value <= 0xc4c2) {
                return "M";
            } else if (value >= 0xc4c3 && value <= 0xc5b5) {
                return "N";
            } else if (value >= 0xc5b6 && value <= 0xc5bd) {
                return "O";
            } else if (value >= 0xc5be && value <= 0xc6d9) {
                return "P";
            } else if (value >= 0xc6da && value <= 0xc8ba) {
                return "Q";
            } else if (value >= 0xc8bb && value <= 0xc8f5) {
                return "R";
            } else if (value >= 0xc8f6 && value <= 0xcbf9) {
                return "S";
            } else if (value >= 0xcbfa && value <= 0xcdd9) {
                return "T";
            } else if (value >= 0xcdda && value <= 0xcef3) {
                return "W";
            } else if (value >= 0xcef4 && value <= 0xd188) {
                return "X";
            } else if (value >= 0xd1b9 && value <= 0xd4d0) {
                return "Y";
            } else if (value >= 0xd4d1 && value <= 0xd7f9) {
                return "Z";
            }
        }

        return s;
    }

下面只是编码表一部分:

  

时间: 2024-11-05 00:58:02

取得汉语拼音首个字母的相关文章

C#获得字符串首字符字母(大写)

/// <summary> /// 获得字符串首字符字母(大写): /// </summary> /// <param name="cnChar"></param> /// <returns></returns> public string GetStringFirstSpell(string cnChar) { //除字母.数字.汉字以外的返回"*" var result = "*&

汉语转拼音(全转与只转首个字母)工具类

1.全转的工具类 ChineseConvertAll.java package Utils.Chinese; /** * 将中文词组转换成拼音 * @author mei * */ public class ChineseConvertAll { private static int[] pyvalue = new int[] { -20319, -20317, -20304, -20295, -20292, -20283, -20265, -20257, -20242, -20230, -20

sql 中实现取得汉字首写字母

create function [dbo].[fn_Get_Chinese_First_Letter](@Str nvarchar(400))returns nvarchar(4000)asbegindeclare @strlen int,@re nvarchar(4000)declare @t table(chr nchar(1) collate Chinese_PRC_CI_AS,letter nchar(1))insert @t select '吖','A' union all selec

js 去掉下划线,后首个字母变大写

1.驼峰转连字符: var s = "fooStyleCss";  s = s.replace(/([A-Z])/g,"-$1").toLowerCase(); //利用正则进行替换,简洁明了,很棒 2.转驼峰 var s1 = "foo-style-css";s1 = s1.replace(//-(/w)/g, function(all, letter){          return letter.toUpperCase();       

C# 获取汉字拼音首字母

最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   本节探讨C#获取汉字拼音首字母的方法: 代码类东西,直接上代码: /// <summary> /// 在指定的字符串列表CnStr中检索符合拼音索引字符串 /// </summary> /// <param name="CnStr">汉字字符串</param> /// <returns&

java汉字转拼音以及得到首字母通用方法

1. [代码]PingYinUtil    package oa.common.utils; import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;import net.sourceforge.pinyin4j.form

C# 获取汉字的拼音首字母

/// <summary> /// 在指定的字符串列表CnStr中检索符合拼音索引字符串 /// </summary> /// <param name="CnStr">汉字字符串</param> /// <returns>相对应的汉语拼音首字母串</returns> public static string GetSpellCode(string CnStr) { string strTemp="&quo

C# 获取汉字的拼音首字母(转)

原文:https://blog.csdn.net/younghaiqing/article/details/62417269 一种是把所有中文字符集合起来组成一个对照表:另一种是依照汉字在Unicode编码表中的排序来确定拼音的首字母.碰到多音字时就以常用的为准(第一种方法中可以自行更改,方法为手动把该汉字移动到对应的拼音首字母队列,我们这里介绍第二种. 获取汉字拼音的首字母是一个在做项目的过程中经常需要用到的功能,今天我们主要来探讨下C# 获取汉字的拼音首字母 static void Main

Css中如何使英文和拼音变成全大写、全小写和首字母大写?

想要实现英文和中文拼音变成全大写.全小写和首个字母大写,需要用到 css中text-transform样式属性,接下来介绍一下 1.text-transform的值 1)Capitalize:英文拼音的首字母大写 2)Uppercase:英文拼音字母全大写 3)Lowercase:英文拼音字母全小写 2.text-transform语法 text-transform:+值类型, 如:text-transform:Capitalize: 3.text-transform的简单使用 1)英文首字母大