简体   繁体   中英

Detect number of bytes required for an arbitrary number in Scala

I'm trying to figure out the simplest way to write a function to detect the amount of bytes required for a number in Scala.

For instance the number

 0 should be 0 bytes
 1 should be 1 byte
 127 should be 1 byte
 128 should be 2 bytes
 32767 should be 2 bytes
 32768 should be 3 bytes
8388607 should be 3 bytes
8388608 should be 4 bytes
2147483647 should be 4 bytes
2147483648 should be 5 bytes
549755813887 should be 5 bytes
549755813888 should be 6 bytes
9223372036854775807 should be 8 bytes.
-1 should be 1 byte
-127 should be 1 bytes
-128 should be 2 bytes
-32767 should be 2 bytes
-32768 should be 3 bytes
-8388607 should be 3 bytes
-8388608 should be 4 bytes
-2147483647 should be 4 bytes
-2147483648 should be 5 bytes
-549755813887 should be 5 bytes
-549755813888 should be 6 bytes
-9223372036854775807 should be 8 bytes

is there any way to do this besides doing the math figuring out where the number is wrt 2^N?

After all the precisions in the comments, I guess the algorithm for negative numbers would be: whatever the answer for their opposite would be; and Long.MinValue is not an acceptable input value.

Therefore, I suggest:

def bytes(x: Long): Int = {
  val posx = x.abs
  if (posx == 0L) 0
  else (64 - java.lang.Long.numberOfLeadingZeros(posx)) / 8 + 1
}

Tests needed.

As I mentioned, you're basically asking for "what's the smallest power-of-2-number larger than my number", with a bit of adjustment for the extra digit for the sign (positive or negative).

Here's my solution, although the result differs for 0 and -128, because, as Bergi commented on your question, you can't really write 0 with 0 bytes, and -128 fits in 1 byte.

import Math._

def bytes(x: Double): Int = {
  val y = if (x >= 0) x + 1 else -x
  ceil((log(y)/log(2) + 1)/8).toInt
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM