Skip to content

efficient_functions

AN QIULIANG edited this page Nov 14, 2016 · 1 revision

1.字母大写转换

void fast_to_upper(const char *src, char *dest, size_t len) {
    size_t i = 0;
    const uint64_t *src_data = (const uint64_t*) src;
    uint64_t *dest_data = (uint64_t*) dest;
    size_t blocks = len / sizeof(uint64_t);
    uint64_t src8, a, b;
    unsigned char src_char, a_char, b_char;

    for (; i < blocks; i++) {
        src8 = src_data[i] & 0x7f7f7f7f7f7f7f7f;
        a = src8 + 0x0505050505050505;
        b = src8 + 0x7f7f7f7f7f7f7f7f;
        a = a & b;
        a = a & (a >> 1) & 0x2020202020202020;
        dest_data[i] = src8 - a;
    }
    i *= sizeof(uint64_t);
    for (; i < len; i++) {
        src_char = src[i] & 0x7f;
        a_char = src_char + 0x05;
        b_char = src_char + 0x7f;
        a_char = a_char & b_char;
        a_char = a_char & (a_char >> 1) & 0x20;
        dest[i] = src_char - a_char;
    }
    dest[i] = 0;
}

2.取绝对值

int abs(int x) {
    int s[] = {-x, x};
    return s[x > 0];
}

int abs(int x) {
    return (x ^ (x >> 31)) - (x >> 31);
}

3.swap

void swap(int& x, int& y) {
    x = x ^ y;
    y = x ^ y;
    x = x ^ y;
}
 
void swap(int& x, int& y) {
    x ^= y ^= x ^= y;
}

4.判斷一個整數是不是 2 的次方

bool ispow2(int n) {
    return (n & -n) == n;
}
Clone this wiki locally