И снова set bit
От: Vasya777 Россия  
Дата: 09.03.13 07:06
Оценка:
Так как тема
Автор: Анатолий Широков
Дата: 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


Как видно, по числу инструкций оба варианта идентичны, но второй занимает больше места
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.