• 自己实现几个基本函数


    void _Assert(char* strFile, unsigned line)
    {
        fflush(stdout);
        fprintf(stderr, "\nAssert Failed %s, line:%u\n", strFile, line);
        fflush(stderr);
        abort();
    }
    
    #ifdef _DEBUG
    #define MY_ASSERT(f) \
        if (f)          \
        NULL;           \
        else            \
        _Assert(__FILE__, __LINE__);
    #else
    #define MY_ASSERT(f)   NULL
    #endif
    
    void* my_memcpy(void* pvTo, void* pvFrom, size_t size)
    {
        byte* pbTo = (byte*)pvTo;
        byte* pbFrom = (byte*)pvFrom;
        MY_ASSERT(pbTo != NULL && pbFrom != NULL);
        MY_ASSERT(pbTo >= pbFrom + size || pbFrom >= pbTo + size);
    
        while(size-- > 0)
            *pbTo++ = *pbFrom++;
        return (void*)pbTo;
    }
    
    char* my_strdup(char* str)
    {
        MY_ASSERT(str != NULL);
        char* strNew = (char*)malloc(strlen(str) + 1);
        if (strNew == NULL)
            return NULL;
        //strcpy(str1,str2)时,str2会把末尾的'\0’也给复制到str1中且覆盖一个str1字符;
        strcpy(strNew, str);
        return strNew;
    }
    
    void* my_memset1(void* pv, byte b, size_t size)
    {
        MY_ASSERT(pv != NULL);
        byte* pb = (byte*)pv;
        while (size-- > 0)
            *pb++ = b;
        return pv;
    }
    
    // 假定long占4字节,一字节为8位
    long* long_fill(void* pv, long l, size_t size)
    {
        MY_ASSERT(pv != NULL);
        long* pl = (long*)pv;
        while (size > 0)
        {
            *pl = l;
            size -= 4;
            pl += 4;
        }
        return (long*)pv;
    }
    
    size_t threshold = 4;
    void* my_memset2(void* pv, byte b, size_t size)
    {
        byte* pb = (byte*)pv;
        if (size > threshold)
        {
            unsigned long l;
            l = (b << 8) | b;
            l = (l << 16) | l;
            pb = (byte*)long_fill((long*)pb, l, size / 4);
            size = size % 4;
        }
    
        while (size -- >0)
            *(pb++) = b;
        return pv;
    }
    struct Prim
    {
        int pos;
        int index;
    };
    
    Prim vecPrim[N];
    
    bool binarySearch(int pos, int& index)
    {
        int first = 0;
        int last = N - 1;
        int mid = 0;
        while (first <= last)
        {
            mid = (first + last) / 2;
            if (vecPrim[mid].pos < pos)
                first = mid + 1;
            else if (vecPrim[mid].pos > pos)
                last = mid - 1;
            else
            {
                index = vecPrim[mid].pos;
                return true;
            }
        }
        return false;
    }
    template<class T>
    int highestBitSet(T input)
    {
        register int result;
        assert(input);        // zero is invalid input!
        assert(sizeof(T)==4); // 32bit data only!
        _asm bsr eax, input
        _asm mov result, eax
        return result;
    }
    
    
    template<class T>
    T nearestPowerOfTwo(T input)
    {  
        // the least possible power-of-two value is 1
        if (input <= 1) return 1;
    
        int highestBit = highestBitSet(input);
        int roundingTest = input & (1<< (highestBit-1)); 
        if (roundingTest) 
            ++highestBit;
        return static_cast<T>(1<<highestBit);
    }
    
    inline int lowestBitSet (unsigned short input)
    {
        register int result;
        assert(input);       // zero is invalid input!
        _asm mov dx, input   // copy into a 32bit reg
        _asm and edx, 0xffff // keep only the bits we want
        _asm bsf eax, edx    // perform the scan
        _asm mov result, eax
        return result;
    }

  • 相关阅读:
    往Matlab中添加工具包
    Deeplearning——Logistics回归
    String类
    机器学习概念性内容整理
    系统的响应与解
    将MathType公式转换为LaTex格式
    【转载】【翻译】Breaking things is easy///机器学习中安全与隐私问题(对抗性攻击)
    在LaTex中插入电路图的方法(插入图片)
    第三章——供机器读取的数据(CSV与JSON)
    第一、二章——Python简介与Python基础
  • 原文地址:https://www.cnblogs.com/kex1n/p/2674243.html
Copyright © 2020-2023  润新知