Так как
темаАвтор: Анатолий Широков
Дата: 15.12.02
закрыта решил написать здесь.
Вот асм (ARM) для двух предлагаемых вариантов:
080000d4 <set_bit1>:
unsigned int set_bit1(unsigned int value, unsigned int index, int bit)
{
unsigned int mask = 1 << index;
80000d4: 2301 movs r3, #1
80000d6: fa13 f101 lsls.w r1, r3, r1
return (bit) ? value | mask : value & mask;
80000da: b112 cbz r2, 80000e2 <set_bit1+0xe>
80000dc: ea41 0000 orr.w r0, r1, r0
80000e0: e001 b.n 80000e6 <set_bit1+0x12>
80000e2: ea01 0000 and.w r0, r1, r0
}
80000e6: 4770 bx lr
080000e8 <set_bit2>:
1<< 8, 1<< 9, 1<<10, 1<<11, 1<<12, 1<<13, 1<<14, 1<<15,
1<<16, 1<<17, 1<<18, 1<<19, 1<<20, 1<<21, 1<<22, 1<<23,
1<<24, 1<<25, 1<<26, 1<<27, 1<<28, 1<<29, 1<<30, 1<<31,
};
unsigned int mask = mask_table[index];
80000e8: 4b04 ldr r3, [pc, #16] ; (80000fc <set_bit2+0x14>)
80000ea: f853 3021 ldr.w r3, [r3, r1, lsl #2]
return (bit) ? value | mask : value & ~mask;
80000ee: b112 cbz r2, 80000f6 <set_bit2+0xe>
80000f0: ea43 0000 orr.w r0, r3, r0
80000f4: e001 b.n 80000fa <set_bit2+0x12>
80000f6: ea20 0003 bic.w r0, r0, r3
}
80000fa: 4770 bx lr
80000fc: 080010e8 .word 0x080010e8
...
80010e8: 00000001 .word 0x00000001
80010ec: 00000002 .word 0x00000002
80010f0: 00000004 .word 0x00000004
80010f4: 00000008 .word 0x00000008
80010f8: 00000010 .word 0x00000010
80010fc: 00000020 .word 0x00000020
8001100: 00000040 .word 0x00000040
8001104: 00000080 .word 0x00000080
8001108: 00000100 .word 0x00000100
800110c: 00000200 .word 0x00000200
8001110: 00000400 .word 0x00000400
8001114: 00000800 .word 0x00000800
8001118: 00001000 .word 0x00001000
800111c: 00002000 .word 0x00002000
8001120: 00004000 .word 0x00004000
8001124: 00008000 .word 0x00008000
8001128: 00010000 .word 0x00010000
800112c: 00020000 .word 0x00020000
8001130: 00040000 .word 0x00040000
8001134: 00080000 .word 0x00080000
8001138: 00100000 .word 0x00100000
800113c: 00200000 .word 0x00200000
8001140: 00400000 .word 0x00400000
8001144: 00800000 .word 0x00800000
8001148: 01000000 .word 0x01000000
800114c: 02000000 .word 0x02000000
8001150: 04000000 .word 0x04000000
8001154: 08000000 .word 0x08000000
8001158: 10000000 .word 0x10000000
800115c: 20000000 .word 0x20000000
8001160: 40000000 .word 0x40000000
8001164: 80000000 .word 0x80000000
Как видно, по числу инструкций оба варианта идентичны, но второй занимает больше места