2022-04-12:给定一个字符串形式的数,比如"3421"或者"-8731", 如果这个数不在-3276832767范围上,那么返回"NODATA", 如果这个数在-3276832767范围上, 那么这个数就没有超过16个二进制位所能表达的范围。 返回这个数的2进制形式的字符串和16进制形式的字符串,用逗号分割。 来自兴业数金。

答案2022-04-12:

自然智慧即可。

代码用golang编写。代码如下:

package main

import (
	"fmt"
	"strconv"
)

func main() {
	num := "10"
	ret := convert(num)
	fmt.Println(ret)
}

// 请保证输入的num字符串一定是数字的形式
func convert(num string) string {
	// 因为-32768~32767所有的数,最多6个字符,所以超过就返回"NODATA"
	if len(num) == 0 || len(num) > 6 {
		return "NODATA"
	}
	// 既然长度不超过6,那么转成整数一定不会有问题
	// 当然你也可以自己写这个转化过程,这个是比较简单的
	//int n = Integer.valueOf(num);
	n, _ := strconv.Atoi(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位),或在一起
	// 比如5323,32位二进制形式如下:
	// 00000000000000000001010011001011
	// 14位~0位是:
	// _________________001010011001011
	// 15位符号位应该是0:
	// ________________0_______________
	// 所以info应该是:
	// ________________0001010011001011
	//
	// 再比如-6725,32位二进制形式如下:
	// 11111111111111111110010110111011
	// 14位~0位是:
	// _________________110010110111011
	// 15位符号位应该是1:
	// ________________1_______________
	// 所以info应该是:
	// ________________1110010110111011
	//int info = (n < 0 ? (1 << 15) : 0) | (n & 65535);
	info := 0
	if n < 0 {
		info = 1 << 15
	}
	info = info | (n & 65535)
	// 此时info的15位~0位,就是我们要的;info的更高位完全没用
	builder := make([]byte, 0)
	// 依次提取二进制信息很简单
	for i := 15; i >= 0; i-- {
		if (info & (1 << i)) != 0 {
			builder = append(builder, '1')
		} else {
			builder = append(builder, '0')
		}
	}
	builder = append(builder, []byte(",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 i := 12; i >= 0; i -= 4 {
		// 1111 << 12
		// ( info & (1111 << 12) ) >> 12
		// ( info & (1111 << 8)) >> 8
		// ( info & (1111 << 4)) >> 4
		// ( info & (1111 << 0)) >> 0
		cur := (info & (15 << i)) >> i
		if cur < 10 {
			builder = append(builder, []byte(fmt.Sprint(cur))...)
		} else {
			switch cur {
			case 10:
				builder = append(builder, 'a')
				break
			case 11:
				builder = append(builder, 'b')
				break
			case 12:
				builder = append(builder, 'c')
				break
			case 13:
				builder = append(builder, 'd')
				break
			case 14:
				builder = append(builder, 'e')
				break
			default:
				builder = append(builder, 'f')
			}
		}
	}
	return string(builder)
}

执行结果如下: 在这里插入图片描述


左神java代码