您的位置:首页 > 编程语言 > C语言/C++

C语言基础之编译预处理及位运算

2017-06-16 14:09 62 查看

                                                                   
   编译预处理及位运算

宏定义
定义:  #define 标识符 字符串     或  #define 标识符(形参表) 字符串
说明:“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。define为宏定义命令。“标识符”为所定义的宏名。 “字符串”可以是常数、表达式、格式串等。
例:
#define PI 3.1415926
#define CIRCUM(r) (2.0*PI*(r))

计算周长时: circum=CIRCUM(3.4); 
注意:(1)宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
   (2)宏定义必须写在函数之外,作用于为宏定义起到源程序结束,如要终止其作用域可使用#undef命令
   (3)宏名若在源程序中用双撇号括起来,则预处理不对其作宏代换

   (4)宏定义允许嵌套

   (5)对输出格式作宏定义,可以减少书写麻烦

例:
#include<stdio.h>
#define P printf
#define D "%d\n"
#define F "%f\n"

void main()
{
 int a=5;
float b=3;
P( D F,a,b);
}

条件编译
条件编译有几种形式
1.#if形式
一般格式:
#if<表达式>
        <程序段1>

[#else
        <程序段2>]
#endif

也可以写为
#if<表达式>
<程序段1>
#endif

2.#ifdef形式或#ifdef形式
一般格式:
#ifdef (或#ifndef)<标识符>
        <程序段1>

[#else
        <程序段2>]
#endif

说明:预处理程序扫描到#ifdef,判别其后面的<标识符>是否被定义过(一般用#define命令定义),从而选择对哪个程序进行编译。

位运算符和位运算
位运算符           含义                          举例
~                       按位取反                    ~a,对变量a中全部二进制位取反
<<                     左移                           a<<2,a中各位全部左移2位,右边补0
>>                     右移                           a>>2,a中各位全部右移2位,左边补0

&                       按位与                       a&b,a和b中各位按位与进行“与”运算
|                        按位或                       a|b,a和b中各位按位与进行“或”运算

^                       按位异或                    a^b,a和b中各位按位与进行“异或”运算           //不同则为1

例:将一个十进制数转换成二进制数
程序分析:C语言中printf函数提供%x%d%o格式可将一个整数以十六进制、十进制、八进制形式输出,但没有二进制输出格式。人工转换的方法是设置一个屏蔽数,其中只有一位是1,其余各位均为0,与被转换数进行“与”运算,根据运算结果判断被测试的那一位是1还是0.其余二进位的测试方法相同。一个整数占两个字节,共有16个二进制位。

#include<stdio.h>
void main()
{
int i,bit;
unsigned int n,mask;
mask=0x8000;
printf("enter your number:");
scanf("%d",&n);
printf("binary of %d is:",n);
for(i=0;i<16;i++)

{
bit=(mask &n)?1:0;
printf("%1d",bit);
if(i==7)
printf("--");
mask=mask>>1;    //右移一位,得到下一个屏蔽字
}
}

a循环右移n位步骤
(1)使a(无符号数)中各位左移(16-n),使右端的n位放到b中的高n位中,其余各位补0
         b=a<<(16-n);

(2)将a中右移n位,由于a不带符号,所以左端补0.
c=a>>n;

(3)使b与c按位或运算,得到最终结果

              
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: