add bit_len and unit tests

pull/13872/head
Subhomoy Haldar 2022-03-30 14:45:11 +05:30
parent 093994655c
commit 33d796f071
2 changed files with 28 additions and 2 deletions

View File

@ -432,3 +432,16 @@ fn test_set_bit() {
a.set_bit(100, false) a.set_bit(100, false)
assert a == b assert a == b
} }
fn test_bit_len() {
assert big.zero_int.bit_len() == 0
assert big.one_int.bit_len() == 1
assert big.integer_from_u32(0xffffffff).bit_len() == 32
assert big.one_int.lshift(1239).bit_len() == 1240
assert big.integer_from_string('4338476092346017364013796407961305761039463198075691378460917856') or {
panic('Could not read from decimal')
}.bit_len() == 212
}

View File

@ -634,8 +634,7 @@ pub fn (integer Integer) binary_str() string {
} }
// Add the sign if present // Add the sign if present
sign_needed := integer.signum == -1 sign_needed := integer.signum == -1
mut result_builder := strings.new_builder(integer.digits.len * 32 + mut result_builder := strings.new_builder(integer.bit_len() + if sign_needed { 1 } else { 0 })
if sign_needed { 1 } else { 0 })
if sign_needed { if sign_needed {
result_builder.write_string('-') result_builder.write_string('-')
} }
@ -901,3 +900,17 @@ pub fn (x Integer) gcd_binary(y Integer) Integer {
} }
return b.lshift(shift) return b.lshift(shift)
} }
[direct_array_access]
pub fn (x Integer) bit_len() int {
if x.signum == 0 {
return 0
}
mut length := 0
for _ in 1 .. x.digits.len {
length += 32
}
return length + (32 - bits.leading_zeros_32(x.digits.last()))
}