22_位运算位段与文件

作业讲解

memcpy

memmove(psz + 5,psz,strlen(“hello world”) + 1)

Debug版和Relese版的结果不同

思考题 求绝对值

int myabs(int n)

{

 int m = n >> 31;// if n < 0,m = ‐1,else m = 0

n = n ^ m;// if m = ‐1, n^m == ~n,else n^m == n

 //if m = ‐1, n ‐ m == n + 1, else n ‐ m == n

return n ‐ m;

}

位运算

1.局部求反,异或

0100100111000

XOR  0000111111000

2.交换

int nA = 9;

int nB = 16;

nA = nA^nB;

nB = nA^nB;

nA = nA^nB;

3.定理

a and 0 = 0;

a and 1 = a;

a or 0 = a;

a or 1 = 1;

a xor 1 = not a;

a xor 0 = a;

a xor ~a = 1;

a xor not a = 1;

a and not a = 0;

a or not a = 1;

位段

struct tagTest

{

int a:1;

int b:1;

int c:1;

int d:1;

}

  1. 无符号扩展,高位填零
  2. 有符号扩展,最高有效位扩展
  3. 用位段表示浮点编码
  4. 赋值超过位长,取最低位
  5. 无名位段,注释写问号
  6. 零位段,一个存储单元32位,从下个32位开始,等价于31位的存储空间
    ceeeeeeeeee??

c:

e:

a:

文件操作

FILE* FP = NULL;

fp = fopen(“test.txt”,”rb+”);

if(fp == NULL)

{

 goto PROC_EXIT:

}
struct tagPerson per =

{

“Rose”,    22,    180.f

};
//放1就对了

fwrite(&per,sizeof(per),1,fp);

if(n != 1)

{

goto PROC_EXIT;

}

PROC_EXIT:

if(fp)

{

fclose(fp);

}

Fp

文件指针的位置:_ptr

缓存首地址:_base

文件属性:_flag

文件数据下标: _file

剩余空间:_cnt

缓冲器大小:_bufsize

写文件的操作实际调用的windowsAPI WriteFile,在fclose和fflush可以看到

关闭文件做了:提交缓存、释放空间、关闭文件、删除占用文件标记

作业

1.用位段表示浮点编码

 
#include 
#include 

struct tagTest
{
    int data : 23;
    unsigned int exp : 8;
    int sign : 1;
};
int main()
{
    float fA = 1234.5f;
    struct tagTest *pTest = (struct tagTest *)&fA;

    printf("%03x\t", pTest->data);
    printf("%02x\r\n", pTest->exp);
    printf("%d\r\n", pTest->sign);

    return 0;
}
0 条评论
发表一条评论