You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
3.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package class_2022_01_2_week;
// 来自兴业数金
// 给定一个字符串形式的数,比如"3421"或者"-8731"
// 如果这个数不在-32768~32767范围上那么返回"NODATA"
// 如果这个数在-32768~32767范围上那么这个数就没有超过16个二进制位所能表达的范围
// 返回这个数的2进制形式的字符串和16进制形式的字符串用逗号分割
public class Code03_StringNumberConvertBinaryAndHexadecimal {
// 请保证输入的num字符串一定是数字的形式
public static String convert(String num) {
// 因为-32768~32767所有的数最多6个字符所以超过就返回"NODATA"
if (num == null || num.length() == 0 || num.length() > 6) {
return "NODATA";
}
// 既然长度不超过6那么转成整数一定不会有问题
// 当然你也可以自己写这个转化过程,这个是比较简单的
int n = Integer.valueOf(num);
// 如果转换完成后超过了范围,那么返回"NODATA"
if (n < -32768 || n > 32767) {
return "NODATA";
}
// 接下来n就是一个在范围上的数字
// 我们要取出16位信息(info),这包括:
// 提取出n的14位~0位的信息 : 也就是(n & 65535)
// 提取出第15位符号位信息 : 如果n<0第15位就是1如果n>=0第15位就是0
// 然后把(15位)和(14位~0位),或在一起
// 比如532332位二进制形式如下
// 00000000000000000001010011001011
// 14位~0位是
// _________________001010011001011
// 15位符号位应该是0
// ________________0_______________
// 所以info应该是
// ________________0001010011001011
//
// 再比如-672532位二进制形式如下
// 11111111111111111110010110111011
// 14位~0位是
// _________________110010110111011
// 15位符号位应该是1
// ________________1_______________
// 所以info应该是
// ________________1110010110111011
int info = (n < 0 ? (1 << 15) : 0) | (n & 65535);
// 此时info的15位~0位就是我们要的info的更高位完全没用
StringBuilder builder = new StringBuilder();
// 依次提取二进制信息很简单
for (int i = 15; i >= 0; i--) {
builder.append((info & (1 << i)) != 0 ? '1' : '0');
}
builder.append(",0x");
// 依次提取16进制的时候每4位提取
// 依次提取4位信息的时候
// 0000 -> 0 -> '0'
// 0001 -> 1 -> '1'
// ...
// 1001 -> 9 -> '9'
// 1010 -> 10 -> 'a'
// 1011 -> 11 -> 'b'
// 1100 -> 12 -> 'c'
// 1101 -> 13 -> 'd'
// 1110 -> 14 -> 'e'
// 1111 -> 15 -> 'f'
for (int i = 12; i >= 0; i -= 4) {
// 1111 << 12
// ( info & (1111 << 12) ) >> 12
// ( info & (1111 << 8)) >> 8
// ( info & (1111 << 4)) >> 4
// ( info & (1111 << 0)) >> 0
int cur = (info & (15 << i)) >> i;
if (cur < 10) {
builder.append(cur);
} else {
switch (cur) {
case 10:
builder.append('a');
break;
case 11:
builder.append('b');
break;
case 12:
builder.append('c');
break;
case 13:
builder.append('d');
break;
case 14:
builder.append('e');
break;
default:
builder.append('f');
}
}
}
return builder.toString();
}
public static void main(String[] args) {
String num1 = "0";
System.out.println(convert(num1));
String zuo = "457";
System.out.println(convert(zuo));
String num2 = "-32768";
System.out.println(convert(num2));
String num3 = "32768";
System.out.println(convert(num3));
String num4 = "32767";
System.out.println(convert(num4));
String num5 = "-1";
System.out.println(convert(num5));
}
}