好吧,伙计们,我完全陷入了这个小问题,我花了几个小时试图研究并找出答案。基本上我所要做的就是找到一个整数的最大位数(使用一个字节作为限制)。我想要做的一个例子是:int 5将显示为8,因为在一个字节中它存储为0000 0101.所有包括255的内容应该输出8.一旦你达到256,它应该输出因为它将被存储为0001 0000 0000。我可以使用if语句但是使用日志有更简单的方法吗?
到目前为止,我所拥有的只是:
int x = 5;
int len = (Integer.toString(x)).length();
double bits = Math.ceil(len*(Math.log(10)/Math.log(2)));
System.out.println(bits);
答案 0 :(得分:1)
一种非常简单的方法:
final double DIVISOR = Math.log(256);
int x = 5;
double bytes = Math.log(x) / DIVISOR;
int bits = (int) Math.ceil(bytes) * 8;
这通过计算基数256中的位数来计算数字的字节数(包括部分字节数)。这使用了两个技巧:
然后将结果向上舍入(处理任何部分字节),并乘以8得到位数。
但请注意,这不一定是一种非常有效的方法。有更多有效的方法可以使用位操作,但可能有点难以理解。至少,这种方法看起来与你已经尝试过的方法类似。
答案 1 :(得分:0)
试试这个:
int bytesNeeded(int x) {
int bytes = 0;
for (; x != 0; bytes++) {
x >>>= 8; // Shift 8 bits (1 byte) right
bytes++; // Count 1 more byte
}
return bytes;
}
x >>> y
,将x
向右移y
个字节,并在左侧插入0。例如,0b00000001 >>> 1 => 0b00000000
和0b11110000 >>> 2 => 0b00111100
。此函数一次向下移动x个字节,直到没有1为止。它必须移动的次数是表示它需要多少字节。
编辑:切换到>>>
运算符以处理负数。
答案 2 :(得分:0)
也可以使用递归:
int getNumberOfBytes(int number) {
if((int)(number / 256) == 0) {
return 1;
}
return getNumberOfBytes(number / 256) + 1;
}