Ваш вопрос не очень понятен. Определение RegisterFrame
не показывается, равно как и результаты последней попытки, о которой вы думали.
... но при условии, что вы пытаетесь «упаковать» значения разных размеров в переменную 'uint64_t'
, у вас было несколько проблем:
Первый: 0xffffffff
- это 32-битное значение, а не 64-битное.
Второй: скажем, tempa содержит 4 бит , tempb содержит 8bit и temp c содержит 16bits , но все они являются переменными uint64_t.
Третье: если вы хотите упаковать {tempa0, tempa1, tempb0, tempb1, tempb2, tempc0, temp1}, ваша ошибка не маскирует фактический требуемый размер (32 бита для всех случаев вместо 4,8,16 бит) и не вращается правильно ( если вы поворачиваете оба значения <<4
, а затем используете побитовое значение или |
, вы, в основном, 'ИЛИ' значения между битами [7: 4], например)
вероятно (не проверено), что вы хотел что-то вроде кода ниже:
RegisterFrame create_register(uint64_t a1,uint64_t a2, uint64_t b0, uint64_t b1, uint64_t b2, uint64_t c1, uint64_t c2){
uint64_t retval = 0x0, tempa1, tempa2, tempb0, tempb1, tempb2, tempc1, tempc2
tempa1 = (a1&0xf) << 0
tempa2 = (a2&0xf) << 4
tempb0 = (b0&0xff) << 8
tempb1 = (b1&0xff) << 16
tempb2 = (b2&0xff) << 24
tempc1 = (c1&0xffff) << 32
tempc2 = (c2&0xffff) << 48
retval = tempa1|tempa2|tempb0|tempb1|tempb2|tempc1|tempc2;
return retval;
}