如何在java中使用位操作缩短长值?
我希望以较短的形式表示长值(例如System.currentTimeInMillis())。 我想我可以在这里使用位操纵,但我被卡住了。我不太擅长比特运算 如果long值为138853440000,如何将其表示为字符串,但长度较短 基本上我想写两个方法,一个编码,一个解码。因此,给定一个缩短的值,我希望能够将其转换回原始的长值,反之亦然 -------更新----------- 我的问题很模糊,很抱歉给你带来困惑。这是我的另一次尝试,试图更好地解释我想要实现的目标。(另外,我会尽量简化我的问题。我们不要考虑节省空间或坚持使用DB) 假设我有一个长值,它是以毫秒为单位的时间戳,例如1388534400123,它是包含其他固定长度数值的长字符串的一部分,例如(为了简单起见)9991388534400888。在本例中,我填充了9999和8888。 现在我将其作为字符串,但我需要一个不会丢失任何原始数据的较短表示形式(例如,我想要9999、1388534400123和8888)。因为这些都是数字,我模糊地认为我可以用位来缩短表示。有什么办法吗?一些想法: 转换为十六进制:如何在java中使用位操作缩短长值?,java,long-integer,bit,Java,Long Integer,Bit,我希望以较短的形式表示长值(例如System.currentTimeInMillis())。 我想我可以在这里使用位操纵,但我被卡住了。我不太擅长比特运算 如果long值为138853440000,如何将其表示为字符串,但长度较短 基本上我想写两个方法,一个编码,一个解码。因此,给定一个缩短的值,我希望能够将其转换回原始的长值,反之亦然 -------更新----------- 我的问题很模糊,很抱歉给你带来困惑。这是我的另一次尝试,试图更好地解释我想要实现的目标。(另外,我会尽量简化我的问题。
// long to hex
String myStr = Long.toHexString(System.currentTimeMillis());
// hex to long
long myLong= Long.valueOf(myStr, 16);
如果您真的不需要毫秒,请修剪最后的数字:
long myNewLong = System.currentTimeMillis() / 1000;
一些想法:
转换为十六进制:
// long to hex
String myStr = Long.toHexString(System.currentTimeMillis());
// hex to long
long myLong= Long.valueOf(myStr, 16);
如果您真的不需要毫秒,请修剪最后的数字:
long myNewLong = System.currentTimeMillis() / 1000;
如果我理解正确的话,您需要一个包含long的信息但比十进制格式的实际数字短的字符串。我建议你用更高的基数来表示你的数字,比如十六进制 您的号码(138853440000)长13位。
十六进制格式为:1434B198400,长度为11位。
使用字母表中的所有字母(以36为基数),它将是:HPVTJ400,长度为8位 减少字符串中数字大小的另一种方法是确定只希望看到一些相关数字并使用科学符号: 假设您只关心6位有效数字,那么您的数字将是:
1.38853E12,长度为10个字符,但比以36为基数的数字容易阅读。如果我理解正确,您需要一个包含长字符信息但比十进制格式的实际数字短的字符串。我建议你用更高的基数来表示你的数字,比如十六进制 您的号码(138853440000)长13位。
十六进制格式为:1434B198400,长度为11位。
使用字母表中的所有字母(以36为基数),它将是:HPVTJ400,长度为8位 减少字符串中数字大小的另一种方法是确定只希望看到一些相关数字并使用科学符号: 假设您只关心6位有效数字,那么您的数字将是:
1.38853E12,长度为10个字符,但比基数为36的数字更易于阅读 因为这些都是数字,我模糊地认为我可以用位来缩短表示。有办法吗 这就是所谓的时间戳,但它对时间戳并没有真正的帮助,因为时间戳一般不会有重复的数字 我需要一个不丢失任何原始数据的较短表示形式 调查各种各样的事物。总体思路是使用7位作为数据,1位作为延续位。如果您的值接近2^31-1和2^63-1,则它们会很昂贵,但如果与您的类型范围相比,您的值倾向于压缩,则可以节省空间 另一件需要考虑的事情是:如果您要在不同的行中存储多个值,请研究结合变量的增量编码。时间戳之间的增量可能仅为秒,适合一个或两个字节 因为这些都是数字,我模糊地认为我可以用位来缩短表示。有办法吗 这就是所谓的时间戳,但它对时间戳并没有真正的帮助,因为时间戳一般不会有重复的数字 我需要一个不丢失任何原始数据的较短表示形式 调查各种各样的事物。总体思路是使用7位作为数据,1位作为延续位。如果您的值接近2^31-1和2^63-1,则它们会很昂贵,但如果与您的类型范围相比,您的值倾向于压缩,则可以节省空间
另一件需要考虑的事情是:如果您要在不同的行中存储多个值,请研究结合变量的增量编码。时间戳之间的增量可能仅为秒,适合一个或两个字节。您希望138853440000如何表示?除以?你到底想做什么?所以你想用一个数字,用更多的内存来表示一个更小的数字?这让我很困惑。长字符串比字符串占用的空间少。。请详细说明您正在尝试做的事情。您能承受“丢失”数据吗:即,长值中是否有有效的有效数字?您希望138853440000如何表示?除以?你到底想做什么?所以你想用一个数字,用更多的内存来表示一个更小的数字?这让我很困惑。长字符串比字符串占用的空间少。。请详细说明您正在尝试做什么。您能承受“丢失”数据吗:即,长期价值中是否存在有效数量的有效数字?好主意,尽管我确实认为OP需要澄清他们正试图更改的数据以及为什么我们能够更好地帮助他们。@MattCoubrough您是对的,实际上,OP已经澄清了她/他在评论中想要什么,但是是的,如果她/他重新编辑问题会更好。我已经编辑了我的帖子。希望它更有意义。谢谢你的建议很好