Есть ли более эффективный способ умножения байтового массива? - PullRequest
0 голосов
/ 17 апреля 2019

Я разработал пакет Golang BESON для выполнения операций с большим числом.

Код операции Умножение :

func Multiply(a []byte, b []byte) {
    ans := make([]byte, len(a) + len(b))
    bits := nbits(b)

    var i uint
    for i = bits - 1; int(i) >= 0; i-- {
        byteNum := i >> 3
        bitNum := i & 7

        LeftShift(ans, 1, 0)
        if (b[byteNum] & (1 << bitNum)) > 0 {
            Add(ans, a)
        }
    }
    copy(a, ans)
}

Мой способ - добавить каждое a умножение бит из b. Есть ли более эффективный способ реализации Multiply?

Редактировать

Пакет BESON представляет большое число в байтовом массиве. Например, он представляет 128-разрядное беззнаковое целое число в байтовом массиве размером 16. Следовательно, при выполнении двух 128-разрядного умножения беззнакового целого числа оно фактически умножает двухбайтовый массив.

Пример: * * тысяча двадцать-пять

  • ввод: a, b
a = []byte{ 204, 19, 46, 255, 0, 0, 0, 0 }
b = []byte{ 117, 10, 68, 47, 0, 0, 0, 0 }
Multiply(a, b)
fmt.Println(a)
  • вывод: a (результат будет записан обратно в a)
[60 4 5 35 76 72 29 47]
...