新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在看图形处理源码的时候有一段宏看不懂,就写了一个demo自己看了一下。
成都创新互联长期为上1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为安顺企业提供专业的成都网站建设、成都网站设计,安顺网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。
还是不大熟悉C语言的位操作。
这个宏挺有意思
注意 括号的位置很重要
((const uint8_t*)(x)) 这相当于把x所在的内存当做一段uint8类型的指针,索引x的第0位,因为是小端机,低位存低字节,所以[0]位存的是低字节,[1]位存的是高字节。
这样想的话,这个宏其实很简单了,就是把16位的无符号数,按照8位一个单位高低位互换
事实也证明如此,程序输出如下
2个字节short int 高低位转化:
short int y=0x7f21;
y = ( (y 0xff00) 8) | ( (y 0x00ff ) 8);
printf("%#x",y);
-------------------------------
也可以利用 union
union B2
{
short int i;
unsigned char c[2];
// 。。。任意两字节类型
} ;
union B2 x;
unsigned char tmp;
x.i=0x1234;
tmp = x.c[0]; x.c[0]=x.c[1];x.c[1]=tmp;
// 也可以用上面的位运算方法交换高低端
printf("%#x\n",x.i);
// union 方法特别适合4字节8字节 大端小端码的转换操作。
#define SWAP(A) (A0x01)7 | (A0x02) 5 | \
(A0x04)3 | (A0x08)1 | \
(A0x10)1 | (A0x20)3 | \
(A0x40)5 | (A0x80)7
优先及问题.
可以直接用位运算:按位与,按位或,移位等
#include "stdio.h"
int main()
{
unsigned char tmp1,tmp2;
printf("please input a char: ");
scanf("%c", tmp1);
tmp2=
((tmp10x01)7)
|((tmp10x02)5)
|((tmp10x04)3)
|((tmp10x08)1)
|((tmp10x10)1)
|((tmp10x20)3)
|((tmp10x40)5)
|((tmp10x80)7);
printf("converted char is: %c\n", tmp2);
return 0;
}
题目很简单,但考察的是面试者的编程习惯和态度。今天闲来无事,多说几句。题目理解为高半字节和低半字节互换: 最好用宏定义 #define CHG_BYTE(bData) (((bData)4)) 注意,1、这种底层操作一般用宏可以增强程序的效率,避免不必要的函数调用开...3167