From 94b36250a1ab8278e0ff5a4b363697018bc4b12c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Silvan=20B=C3=BCdenbender?= <42788329+SilvanCodes@users.noreply.github.com> Date: Tue, 19 Nov 2019 01:32:44 +0100 Subject: [PATCH] bitfield: fix bit order --- vlib/bitfield/bitfield.v | 27 +++++---------------------- vlib/bitfield/bitfield_test.v | 8 +++----- 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/vlib/bitfield/bitfield.v b/vlib/bitfield/bitfield.v index f0fd188af8..51caec4333 100644 --- a/vlib/bitfield/bitfield.v +++ b/vlib/bitfield/bitfield.v @@ -13,7 +13,7 @@ Bit arrays are stored in data structures called 'BitField'. The structure is provides API (functions and methods) for accessing and modifying bit arrays. */ -struct BitField { +pub struct BitField { mut: size int //field *u32 @@ -77,36 +77,19 @@ fn cleartail(instance mut BitField) { // public functions -// from_bytes() converts a byte arry into a bitfield. -// Be aware of possible trailing zeroes being added -// due to the underlying 32bit int containers. +// from_bytes() converts a byte array into a bitfield. pub fn from_bytes(input []byte) BitField { mut output := new(input.len * 8) for i, b in input { - pos := i / 4 - match i % 4 { - 0 { - output.field[pos] = output.field[pos] | (u32(b) << 24) - } - 1 { - output.field[pos] = output.field[pos] | (u32(b) << 16) - } - 2 { - output.field[pos] = output.field[pos] | (u32(b) << 8) - } - 3 { - output.field[pos] = output.field[pos] | u32(b) - } - } + output.field[i / 4] |= u32(b) << ((i % 4) * 8) } - return output } -// str2bf() converts a string of characters ('0' and '1') to a bit +// from_string() converts a string of characters ('0' and '1') to a bit // array. Any character different from '0' is treated as '1'. -pub fn str2bf(input string) BitField { +pub fn from_string(input string) BitField { mut output := new(input.len) for i := 0; i < input.len; i++ { if input[i] != 48 { diff --git a/vlib/bitfield/bitfield_test.v b/vlib/bitfield/bitfield_test.v index e7a6d456a6..529fdbcd03 100644 --- a/vlib/bitfield/bitfield_test.v +++ b/vlib/bitfield/bitfield_test.v @@ -127,16 +127,14 @@ fn test_bf_from_bytes() { output := bitfield.from_bytes(input) mut result := 1 for i := 0; i < input.len * 8; i++ { - expected := input[input.len - 1 - i / 8] >> i % 8 & 1 - actual := output.getbit(i) - if expected != actual { + if (input[i / 8] >> (i % 8)) & 1 != output.getbit(i) { result = 0 } } assert result == 1 } -fn test_bf_str2bf() { +fn test_bf_from_string() { rand.seed(time.now().uni) len := 80 mut input := '' @@ -148,7 +146,7 @@ fn test_bf_str2bf() { input = input + '0' } } - output := bitfield.str2bf(input) + output := bitfield.from_string(input) mut result := 1 for i := 0; i < len; i++ { if input[i] != output.getbit(i) + 48 {