C function implementation: memcpy and strcpy and others

2 篇文章 0 订阅

1. memcpy. An often being asked interview question. The key is to handle address overlap.

void *memcpy(void *dest, const void *src, size_t n)
{
    int i, l;
    void *dst;
    char *d, *s;

    d = dest;
    s = src;

    dst = dest;

    if (!dest || !src)
        return NULL;

    if (s < d && (s+n > d)) { // only (s < d) is necessary
        s += n - 1;
        d += n - 1;
        for (i = 0; i < n; i++) {
            *d-- = *s--;
        }
        return dst;
    }

    for (i = 0; i < n; i++) {
        *d++ = *s++;
    }
    return dst;
}

2. strcpy. another thought about strcpy(), does address overlap need to consider?

char *strcpy(char *dst, const char *src)
{
    if (!dst || !src)
        return NULL;

    char *d = dst;
    int len = strlen(src);

    if (src < dst && (src + len+1 > dst)) {
        int i;
        src += len;
        dst += len;
        for (i = 0; i < len+1; i++) {
            *dst-- = *src--;
        }
        return d;
    }

    while ((*dst++ = *src++) != '\0');
    return d;
}

3. count how many bit is 1 in one byte.

// 常规方法
char count1(int n)
{
    int i;
    int c = 0;
    for (i = 0; i < 32; i++) {
        c += (n & (1 << i)) ? 1 : 0;
    }
    return c;
}

// 较优算法
char count1_bitand(int n)
{
    int c = 0;

    while(n) {
        // n&(n-1)的作用是清除n的二进制数中最后一个1,
        // 即如果a=101011000B,那么清除最后一个1之后就变成了a=101010000B.
        n &= n - 1; 
        c++;
    }
    return c;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值