我需要一个Java函数来给出表示给定整数所需的字节数。当我通过2时它应该返回1,400 - > 2,822222 - > 3,等等。
@Edit:现在我坚持这个:
numOfBytes = Integer.highestOneBit(integer) / 8
不确切知道highOneBit()的作用,但也试过了:
numOfBytes = (int) (Math.floor(Math.log(integer)) + 1);
我在某个网站上找到了。
答案 0 :(得分:3)
Integer.highestOneBit(arg)
仅返回原始位置中的最高设置位。例如,Integer.highestOneBit(12)
是8,而不是3.所以你可能想要使用Integer.numberOfTrailingZeros(Integer.highestOneBit(12))
,它确实返回3.这是Integer API
一些示例代码:
numOfBytes = (Integer.numberOfTrailingZeroes(Integer.highestOneBit(integer)) + 8) / 8;
+ 8
用于正确舍入。
答案 1 :(得分:2)
static int byteSize(long x) {
if (x < 0) throw new IllegalArgumentException();
int s = 1;
while (s < 8 && x >= (1L << (s * 8))) s++;
return s;
}
答案 2 :(得分:2)
执行此操作的惰性/低效方法是使用Integer#toBinaryString
。它将为您删除正数中的所有前导零,您只需拨打String#length
并除以8
。
答案 3 :(得分:0)
考虑如何使用普通的十进制数来解决同样的问题。然后将相同的原理应用于二进制/字节表示,即使用256,其中您将使用10作为十进制数。
答案 4 :(得分:0)
static int byteSize(long number, int bitsPerByte) {
int maxNumberSaveByBitsPerByte = // get max number can be saved by bits in value bitsPerByte
int returnValue = getFloor(number/maxNumberSaveByBitsPerByte); // use Math lib
if(number % maxNumberSaveByBitsPerByte != 0)
returnValue++;
return returnValue;
}
答案 5 :(得分:0)
对于正值:0和1需要1位数,2位数字可以得到加倍的最大值,对于每个数字,它是该值的2倍。因此,递归解决方案是划分:
public static int binaryLength (long l) {
if (l < 2) return 1;
else 1 + binaryLength (l /2L);
}
但转变也有效:
public static int binaryLength (long l) {
if (l < 2) return 1;
else 1 + binaryLength (l >> 1);
}
负值具有前导1,因此对于该问题没有多大意义。如果我们假设binary1是decimal1,则binary1不能为-1。但它会是什么? B11?那就是3.
答案 6 :(得分:0)
为什么你不会做这样简单的事情:
private static int byteSize(int val) {
int size = 0;
while (val > 0) {
val = val >> 8;
size++;
}
return size;
}
答案 7 :(得分:0)
int numOfBytes = (Integer.SIZE >> 3) - (Integer.numberOfLeadingZeros(n) >> 3);
这种实现非常紧凑,性能友好,因为它不涉及任何浮点运算,也不涉及任何循环。
它来自以下形式:
int numOfBytes = Math.ceil((Integer.SIZE - Integer.numberOfLeadingZeros(n)) / Byte.SIZE);
优化形式中的幻数3
来自以下假设:Byte.SIZE
等于8