при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Даже на МК не аппаратно поддерживающих float?Reflector писал(а):Будет быстрее
Код: Выделить всё
; h = h * (uint32_t) (65536 * (360.0f / 256) + 0.5f) >> 16;
20000314 ldr r3, [r7, #4]
20000316 mov.w r2, #92160 ; 0x16800
2000031A mul.w r3, r2, r3
2000031E lsrs r3, r3, #16
20000320 str r3, [r7, #4]Код: Выделить всё
h = uint32_t(h * Fixed<16>(360.0f / 256));
// str r3, [sp, #0]
// movs r3, #180
// lsls r3, r3, #9
// muls r3, r7
// asrs r3, r3, #16
// str r3, [sp, #12]
Код: Выделить всё
h = h*92160 >> 16; Код: Выделить всё
h = (uint32_t)h*360 >> 8; Код: Выделить всё
h = (uint32_t)h*360 >> 8; Код: Выделить всё
h = (uint32_t)h*360/256;
MOV R0,#+360
LDRB R2,[R1, #+2]
SMULBB R2,R0,R2
LSRS R2,R2,#+8
STRB R2,[R1, #+2]Код: Выделить всё
h = (uint32_t)h*360/256;
LDRB R1,[R0, #+2]
MOVS R2,#+180
LSLS R2,R2,#+1
MULS R1,R2,R1
LSRS R1,R1,#+8
STRB R1,[R0, #+2]Код: Выделить всё
Fixed<12> k(0.028261f);
rtt.printf<"{}, {}, {}\n">(k.rawValue(), (k*10).toStr(), (float)k); // 29634, 0.2826, 2.82611847e-2Код: Выделить всё
volatile uint32_t val = 10000;
const uint32_t k = (1 << 20) * 0.028261 + 0.5;
uint32_t out = (uint64_t)k * val >> 20; // -> 282Код: Выделить всё
volatile uint32_t val = 10000;
const uint32_t N = 13;
const uint32_t D = 46 * 10;
uint32_t out = val * N / D; // -> 282
При том, ушли от понятной формулыReflector писал(а):При чем тут кресты...
Код: Выделить всё
uint8_t value = ((24 * h / 17) / 60) % 6;Код: Выделить всё
uint8_t value = ((25* h / 18) / 59) % 7;Код: Выделить всё
uint8_t value = ((24 * h / 17) / 60) % 6;Код: Выделить всё
constexpr auto countSetBits(uint32_t value)
{
auto bits = 0;
while (value)
{
value &= value - 1;
bits++;
}
return bits;
}