您的位置:首页 > 其它

位运算详解与实例

2011-11-08 20:07 218 查看
 多字节转换为单字节
#include <stdio.h>

int main()
{
//int data = 65793;
int data = 16843009;

char data_one = data & 0xff;

data = data>>8;

char data_two = data & 0xff;

data = data>>8;

char data_three = data & 0xff;

data = data>>8;

char data_four = data & 0xff;

printf("%d\n",data_one);

printf("%d\n",data_two);

printf("%d\n",data_three);

printf("%d\n",data_four);

printf("LengthOfFloat = %d\n",sizeof(float));//4

printf("LengthOfDouble = %d\n",sizeof(double));//8

return 0;
}


单字节转换为多字节

#include <stdio.h>

int main()
{
//int data = 65793;
int data = 16843011;

char data_one = data & 0xff;

data = data>>8;

char data_two = data & 0xff;

data = data>>8;

char data_three = data & 0xff;

data = data>>8;

char data_four = data & 0xff;

printf("%d\n",data_one);

printf("%d\n",data_two);

printf("%d\n",data_three);

printf("%d\n",data_four);

printf("LengthOfFloat = %d\n",sizeof(float));

printf("LengthOfDouble = %d\n",sizeof(double));

data = data_four<<24;

data += (data_three<<16);

data += (data_two<<8);

data += data_one;

printf("\n%d\n",data);

return 0;
}


//理解清楚

#include <stdio.h>

int main()
{
//int data = 65793;
int data = 16843011;

char data_one = data & 0xff;

data = data>>8;

char data_two = data & 0xff;

data = data>>8;

char data_three = data & 0xff;

data = data>>8;

char data_four = data & 0xff;

printf("%d\n",data_one);

printf("%d\n",data_two);

printf("%d\n",data_three);

printf("%d\n",data_four);

printf("LengthOfFloat = %d\n",sizeof(float));

printf("LengthOfDouble = %d\n",sizeof(double));

data = ( (data_four<<24) & 0xff000000 );

data += ( (data_three<<16) & 0x00ff0000 );

data += ( (data_two<<8) & 0x0000ff00 );

data += ( data_one & 0x000000ff );

printf("\n%d\n",data);

return 0;
}

 

 

实现a,b相加

#include <stdio.h>

int sum(int a,int b)
{
if(a == 0)
{
return b;
}
else
{
return sum((a & b) << 1,a ^ b);
}
}
void main()
{
printf("sum = %d\n",sum(123,456));
}


///////////////////

#include<stdio.h>
int main()
{
int  a='abc';
printf("%s\n",&a);
//printf(&a);
}


输出:cba

请按任意键继续. . .

为什么会输出cba呢?

int a='abc';

编译器会将'abc'扩展为int,它的值为

6382179 即0x00616263

而intel int内存的实际存储格式是低位在前,所以实际a指向的内容为

0x63626100

如果按字串输出,正好是

cba

且正好是以\0结尾。

你的机器是小端,所以按照从小到大的顺序打印cba;因为你的int是4位,而abc是三位,所以可以正常输入和打印。

说的很透彻了,在little-endian的架构上上面的代码会输出cba,但是在big-endian的机器上就不会这样了。

所以这个题目要区别说明是大端还是在小端的机器上。

在小端的机器上结果是:cba

在大端的机器上结果是:abc

/*

     字节对齐与大小端问题,参考http://blog.csdn.net/reiskie/article/details/1647605

*/
#include<stdio.h>
int main()
{
int  a='abc';
int  b=6382179;  //'abc'扩展为int (IDE:VC6.0)

printf("%02x\n",b);  //VC6.0显示616263

printf("%s\n",&a);

}
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int a = 'abc';
char *str = "cba";
int b;

memcpy(&b, str, 4);
printf("(char *)&a = %s\n", &a);
printf("a 的 4 个字节(从高位到低位):%02x %02x %02x %02x\n"
, (a >> 24) & 0xFF
, (a >> 16) & 0xFF
, (a >> 8 ) & 0xFF
, a & 0xFF);

printf("(char *)&b = %s\n", &b);
printf("b 的 4 个字节(从高位到低位):%02x %02x %02x %02x\n"
, (b >> 24) & 0xFF
, (b >> 16) & 0xFF
, (b >> 8 ) & 0xFF
, b & 0xFF);
return 0;
}


几个问题:
#include <stdio.h>

int main()
{
int a = 15,b = 2;

a /= b + 1;

int c = (1,2);

printf("%d,%d\n",a,c);//5,2

return 0;
}


 

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