JAVA 中怎么构造占两个字节(16位)的对象

shstalent2013 2014-06-27 03:48:26
已经确定了只有两个字节的空间,但是需要存储大于32767的数,寻求帮助?
...全文
538 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
之奇一昂 2014-06-29
  • 打赏
  • 举报
回复
引用 9 楼 rumlee 的回复:
用字节数组就可以了。 下面写了一个两位字节数组与int互转的方法供你参考。


public class Test {

	public static void main(String[] args) {
		byte[] b = getBytes(32769);
		System.out.printf("%d,%d\n", b[0], b[1]);
		int i = getInt(b);
		System.out.println(i);
	}

	public static byte[] getBytes(int data) {
		byte[] bytes = new byte[2];
		bytes[1] = (byte) (data & 0xff);
		bytes[0] = (byte) ((data & 0xff00) >> 8);
		return bytes;
	}

	public static int getInt(byte[] bytes) {
		return (int) ((0xff & bytes[1]) | (0xff00 & (bytes[0] << 8)));
	}
}

引用 10 楼 zhouren1314 的回复:
楼主 利用数据加密的思想不知道可以么?
	Integer i=32767;
	
		System.out.println(i.toBinaryString(i).length()); 
		
		char [] arr={' ','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'};
		StringBuffer sb=new StringBuffer();
		while(i!=0){
			System.out.println((i>>4)&0x0f); 
			char c=arr[(i>>4)&0x0f];
			sb.append(c);
			i>>=4;
		}
		System.out.println(sb.toString());
	}
打印的结果为 EE6,只用到了十二位
向两位学习了~ 我只想到了通过把16位的数通过位移什么的分成两个8位的byte,具体代码没想好呢就看到已经出来了。 数组加密以后别处能用到
乔不思 2014-06-29
  • 打赏
  • 举报
回复
引用 10 楼 zhouren1314 的回复:
楼主 利用数据加密的思想不知道可以么?
	Integer i=32767;
	
		System.out.println(i.toBinaryString(i).length()); 
		
		char [] arr={' ','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'};
		StringBuffer sb=new StringBuffer();
		while(i!=0){
			System.out.println((i>>4)&0x0f); 
			char c=arr[(i>>4)&0x0f];
			sb.append(c);
			i>>=4;
		}
		System.out.println(sb.toString());
	}
打印的结果为 EE6,只用到了十二位
达不到楼主要求,不过是个思路
乔不思 2014-06-29
  • 打赏
  • 举报
回复
楼主 利用数据加密的思想不知道可以么?
	Integer i=32767;
	
		System.out.println(i.toBinaryString(i).length()); 
		
		char [] arr={' ','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'};
		StringBuffer sb=new StringBuffer();
		while(i!=0){
			System.out.println((i>>4)&0x0f); 
			char c=arr[(i>>4)&0x0f];
			sb.append(c);
			i>>=4;
		}
		System.out.println(sb.toString());
	}
打印的结果为 EE6,只用到了十二位
rumlee 2014-06-28
  • 打赏
  • 举报
回复
用字节数组就可以了。 下面写了一个两位字节数组与int互转的方法供你参考。


public class Test {

	public static void main(String[] args) {
		byte[] b = getBytes(32769);
		System.out.printf("%d,%d\n", b[0], b[1]);
		int i = getInt(b);
		System.out.println(i);
	}

	public static byte[] getBytes(int data) {
		byte[] bytes = new byte[2];
		bytes[1] = (byte) (data & 0xff);
		bytes[0] = (byte) ((data & 0xff00) >> 8);
		return bytes;
	}

	public static int getInt(byte[] bytes) {
		return (int) ((0xff & bytes[1]) | (0xff00 & (bytes[0] << 8)));
	}
}

日知己所无 2014-06-28
  • 打赏
  • 举报
回复
byte数组就行吧,两个字节最大FFFF可以保存到65535这么大的数
shine333 2014-06-27
  • 打赏
  • 举报
回复
问题不在于你要存储的数值大小,而在于你要存储的精确值的多少。 举个例子: int和float都是32bit,但是一个存储的范围[-2,147,483,648~2,147,483,647],一个的范围(不考虑精确度)却是正负无穷。但是,他们能精确对应的值的个数都是一样的2的32次方个。 同样,你的例子,你只有16bit,只要你想存储的精确值个数不超过65536个,那就有可能(顶多读写时候步骤多一点,计算复杂点)。反过来,如果要存储的精确值超过65536个,那就是Mission Impossible 比如,你要存储的32768~65536或者32768~50000,那就把0000 0000 0000 0000(16个二进制0)映射为32768,0000 0000 0000 0001 当作32769 .... 总之,重点不在范围,而在精确值的个数。
vnvlyp 2014-06-27
  • 打赏
  • 举报
回复
你这问题问得莫名其妙。。 完全不知道你是什么意思。。
LinY_X 2014-06-27
  • 打赏
  • 举报
回复
我2B了 突然想起来32767是2的15次方-1
LinY_X 2014-06-27
  • 打赏
  • 举报
回复
32767有啥特殊含义么
  • 打赏
  • 举报
回复
那就是字节里存放地址,地址对应的一个能存储目标数的空间。
Mr-稻帅 2014-06-27
  • 打赏
  • 举报
回复
引用 1 楼 wula0010 的回复:
很奇怪,你是怎么确定的?
同问。。。
wula0010 2014-06-27
  • 打赏
  • 举报
回复
很奇怪,你是怎么确定的?

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧