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

第十二章 位运算与嵌入式编程

2014-11-25 11:31 148 查看

1.1 位制转换

例题1

#define BIT_MASK(bit_pos) (0x01 << (bit_pos))

int Bit_Reset(unsigned int* val, unsigned char pos) {

if(pos >= sizeof(unsigned int) * 8)

return 0;

*val = *val & ~BIT_MASK(pos);

return 1;

}

int main() {

unsigned int x = 0xffffffff;

unsigned char y = 4;

Bit_Reset(&x, y);

printf("%x", x);

return 0;

}

其运行结果如下:



例题2

int main() {

unsigned short int i = 0;

int j = 8;

int p;

p = j << 1;

i = i - 1;

printf("p: %d, i: %d\n", p, i);

return 0;

}

运行结果如下图所示:



例题3

union {

unsigned char a;

unsigned int i;

}u;

int main() {

u.i = 0xf1f2f3f4;

unsigned char *p = (unsigned char *)&u.i;

printf("p: %p, *p: %x\n", p, *p);

p++;

printf("p++: %p, *p: %x\n", p, *p);

p++;

printf("p++: %p, *p: %x\n", p, *p);

p++;

printf("p++: %p, *p: %x\n", p, *p);

printf("u.i: %x\n", u.i);

printf("&u.a: %p, u.a: %x\n", &u.a, (int)u.a);

return 0;

}

其运行结果如图所示:0x00f97140存放0xf4,0x00f97141存放0xf3,
0x00f97142存放0xf2,0x00f97143存放0xf1。所以VC是小端模式。
且u.a与u.i共享一片内存空间,存储在地址0x00f97140上。



例题4

#define BIT3 (0x01 << 3)

void set_bit3(int* p) {

*p |= BIT3;

}

void clear_bit3(int* p) {

*p &= ~BIT3;

}

int main() {

int b = 0xfffffff7;

int c = 0xffffffff;

printf("before b: %x, c: %x\n", b, c);

set_bit3(&b);

clear_bit3(&c);

printf("after b: %x, c: %x\n", b, c);

return 0;

}

运行结果如图所示:



例题5

int main() {

int *pa = NULL;

//same type pointer addition and substraction. so 15 is pointer.

int *pb = pa + 15;

printf("pb: %x = %d", pb, pb);

return 0;

}

运行结果如下图所示:



1.2 嵌入式编程

例题1

int main() {

unsigned int zero = 0;

unsigned int compzero = ~0;

printf("zero: %d, compzero: %d\n", zero, compzero);

return 0;

}

运行结果如下图所示:



例题2

#include <stdlib.h>

#include <string.h>

int main() {

char *ptr;

if ((ptr = (char*)malloc(0)) == NULL)

printf("Got a null pointer.\n");

else

printf("Got a valid pointer.\n");

int a = strlen(ptr = (char *)malloc(0));

if(int pp = (strlen(ptr = (char *)malloc(0))) == 0)

printf("Got a null pointer.\n");

else

printf("Got a valid pointer.\n");

if(int pp = (sizeof(ptr = (char *)malloc(0))) == 4)

printf("Got a null pointer.\n");

else

printf("Got a valid pointer.\n");

return 0;

}

运行结果如下所示:malloc当不能成功分配一片内存空间时,将会返回NULL。
当传入0时,malloc会成功分配一片内存空间的。

对于strlen() 为啥不为0,请详细看 http://blog.csdn.net/nbbwyf/article/details/41205413这个网址的1.2-例题1里的解释了。 这里其实应该输出“Got a null pointer.”



1.3 static

例题1

int sum(int a) {

auto int c = 0;

static int b = 3;

c+=1;

b+=2;

return (a+b+c);

}

int main() {

int I;

int a = 2;

for(I = 0; I < 5; I++)

printf("%d, ", sum(a));

return 0;

}

static变量与auto变量区别。
运行结果如下图所示:

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