C语言小技巧

#include "stdio.h"

typedef unsigned char uchar;
typedef unsigned char u8;

/***********************************************************
****程序全称:数据高低位转换
****程序功能:1001010101011100=0011101010101001
****输    入: 要转换位数  要转换数据
****返    回:转换后的数据
****默认当被转换的数据前面有无穷个0
***********************************************************/
int data_to_data(unsigned char num,unsigned int data)
{        //高低位..互换.
        unsigned char i;
        unsigned int m = 0;

        for(i = 0;i<num;i++){
             m= (m<<1)+(data&1);
             data >>=1;
        }
        return(m);
}

/***********************************************************
****程序全称:数据高低位转换
****程序功能:10010101=10101001
****输    入: 要转换数据
****返    回:转换后的数据
***********************************************************/
uchar reverse_bit(uchar data)
{        //高低位..互换.
        data=(data<<4)|(data>>4);
        data=((data&0x33)<<2)|((data&0xCC)>>2);
        data=((data&0x55)<<1)|((data&0xAA)>>1);
        return data;
}

//得到指定地址上的一个字节或字
#define  MEM_B( x )  ( *( (char *) (x) ) )
#define  MEM_W( x )  ( *( (short *) (x) ) )

//最大值最小值
#define  MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

//得到一个结构体中field所占用的字节数
#define FSIZ( type, field )        (sizeof( ((type *) 0)->field ))
//得到一个field在结构体(struct)中的偏移量
#define OFFSETOF(type, field) ((char)&(((type *)0)->field))
//按照LSB格式把两个字节转化为一个Word
#define  FLIPW( ray ) ( (((short) (ray)[0]) * 256) + (ray)[1] )
//按照LSB格式把一个Word转化为两个字节
#define  FLOPW( ray, val ) \
  (ray)[0] = ((val) / 256);   (ray)[1] = ((val) & 0xFF)

//10,得到一个字的高位和低位字节

#define  WORD_LO(xxx)  ((byte) ((word)(xxx) & 255))

#define  WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8))

//11,返回一个比X大的最接近的8的倍数

#define RND8( x )       ((((x) + 7) / 8 ) * 8 )

//12,将一个字母转换为大写

#define  UPCASE( c ) ( ((c) >= ‘a‘ && (c) <= ‘z‘) ? ((c) - 0x20) : (c) )

//13,判断字符是不是10进值的数字

#define  DECCHK( c ) ((c) >= ‘0‘ && (c) <= ‘9‘)

//14,判断字符是不是16进值的数字

#define  HEXCHK(c)    (\
            ( (c) >= ‘0‘ && (c) <= ‘9‘)) ||              ((c) >= ‘A‘ && (c) <= ‘F‘)) ||              ((c) >= ‘a‘ && (c) <= ‘f‘))                    )

//15,防止溢出的一个方法

#define  INC_SAT( val )  (val = ((val)+1 > (val)) ? (val)+1 : (val))

//16,返回数组元素的个数

#define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) )

//17,返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)

#define MOD_BY_POWER_OF_TWO( val, mod_by ) \
           ( (dword)(val) & (dword)((mod_by)-1) )

/*****************************************************************************
****        Byte2BCD
****
****
*****************************************************************************/
uchar Byte2BCD(uchar Data)
{
        uchar Rslt=0;

        if (Data>=99) return 0x99;
        while(Data>9)
        {
          Data-=10;
          Rslt+=0x10;
        }
        return(Rslt+Data);
}

/*****************************************************************************
****        BCD2Byte
****
****
*****************************************************************************/
uchar BCD2Byte(uchar Data)
{
        return(((Data>>4)&0x0f)*10+(Data&0x0f));
}

struct _People {
    unsigned int age;
    char     gender;
    double      income;
    char xx;
    char yy;
}n;

void test(void)
{
    u8 x=0x51;
    //x=reverse_bit(x);
//    printf("%d\n",&x);
    //printf("%d\n",MEM_B(&x));
    //printf("pos:%d\n",(char *)&n.yy-(char *)&n);
    //printf("%d\n",OFFSETOF(struct _People,yy));
    printf("%d\n",sizeof(short));

}
时间: 2024-10-23 04:54:19

C语言小技巧的相关文章

C语言打印输出,scanf使用注意事项,小技巧

 今天看一帖子,赵忠大哥的回复挺经典也很有用,记录下来! 1.在每个最后不带\n的printf后面加fflush(stdout); 2.在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);另外请检查scanf的返回值. 3.在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题. C语言打印输出,scanf使用注意事项,小技巧

ACM 刷题小技巧【转】

转载自URl-team ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 大数据输入输出时最好不要用cin.cout,防止超时. 2.有时候int型不够用,可以用long long或__int64型(两个下划线__). 值类型表示值介于 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之间的整数.

iOS 小技巧总结,绝对有你想要的

iOS 小技巧总结,绝对有你想要的 原文链接:http://www.jianshu.com/p/4523eafb4cd4 在这里总结一些 iOS 开发中的小技巧,能大大方便我们的开发,持续更新. —— 由 xcvxvxc分享 在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 在viewWillAppear里面添加如下代码: //分组列表头部空白处理 CGRect frame = myTableView.tableHeade

avascript小技巧

avascript小技巧 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x event.y 窗体活动元素 

最实用的10个重构小技巧排行榜

LZ最近一直在研究虚拟机源码,可惜目前还只是稍微有一点点头绪,无法与各位分享,庞大的JAVA虚拟机源码果然不是一朝一夕能搞定的,LZ汗颜. 本次我们抛开JAVA虚拟机源码这些相对底层的东西,LZ来与各位探讨一下几个代码重构的小技巧,这些内容部分来自于书籍当中,部分来自于LZ维护项目当中的一些实践经验.如果猿友们曾经用过这种手法,也不妨参与到文章的留言当中,将你的小心得.小体会共享与他人,也可以拿来冲击LZ自己定义的排行榜,LZ不甚欢迎. 重构的手法有很多种,相对而言,一篇文章的涵盖量自然是无法提

创业团队 iOS 开发的小技巧

真的是好久好久没有发文章了,其实攒了不少篇草稿:深入浅出 AFNetworking.如何阅读 crash 文件.UIKit response chain 等等,但是基本上,还没放出来,国内外的大大们写了同样的内容,而且基本上我想表达的都说了,写得还比我写得好. 但作为一个有输出的男人,还是要写点什么的.但我能分享给大家的除了创业经验,作合伙人的经验,也就剩下这种提升单兵作战能力的,歪门邪道小技巧了.于是,这里就准备开坑写这个系列.不过我这里推荐的基本上都是国内服务,但是大可放心,我完全没有收任何

Android——Android Studio的一些小技巧(转)

ndroid课程---Android Studio的一些小技巧 APK瘦身 在Android Studio中我们可以开启混淆,和自动删除没有Resources文件,来达到给APP瘦身的目的,这对于一些维护很久的老项目比较有用,里面有很多无效的Resource, 删除后生成的APK会小很多 我们只需要在项目的build.gradle中加入 android { buildTypes { release { minifyEnabled true shrinkResources true } } } m

&lt;转&gt; 30 个有关 Python 的小技巧

目录[+] 1.1 拆箱 1.2 拆箱变量交换 1.3 扩展拆箱(只兼容python3) 1.4 负数索引 1.5 切割列表 1.6 负数索引切割列表 1.7指定步长切割列表 1.8 负数步长切割列表 1.9 列表切割赋值 1.10 命名列表切割方式 1.11 列表以及迭代器的压缩和解压缩 1.12 列表相邻元素压缩器 1.13 在列表中用压缩器和迭代器滑动取值窗口 1.14 用压缩器反转字典 1.15 列表展开 1.16 生成器表达式 1.17 字典推导 1.18 用字典推导反转字典 1.19

iOS开发中的那些小技巧

一,前言 看到这个图,你会想起谁?是不是想起了,曾经的用户名输入框,密码输入框... 那么,问题来了:作为iOS开发的你,这个输入框你是怎么实现的,成为关键. 二,方案 方案1:弄一个UIView,在这个视图上分别放三个控件:UIImageView,UILabel与UITextField.(这个方案很直接,如果你只是简单的直接将三个控件放到视图上,那么你的月薪暴露了,最多3K.如果你是对这个视图重写了,将那三个控件封装起来了,放在.h文件,那你的月薪应该是3.5K,如果是将那三个控件放到.m文件