位运算和算法(习题)

首先求空间长度sizeof().

#include<stdio.h>
//程序=算法+数据
//运算符:
int main()
{
//调用函数  函数名()
//定义变量
//1求空间长度
	int a=100;
	short ilen=sizeof  a;
//引用变量:变量的内容
	printf("%d\n",ilen);
}

赋值运算.

#include<stdio.h>
int main()
{
//2赋值运算符     左值=右值	注:左值必须是变量
	//signed short a;
	//a=65536;	//溢出
	//不同类型转换
/*
	short a=257;//00000001 00000001
	char b=a;//将整型赋值给字符(低字符赋值)
	float c=3.14;
	a=c;
	printf("%d\n",a);
	//浮点型=整型
	c=125;
	printf("%f\n",c);
}

算术运算.

#include<stdio.h>
int main()
{
//算术运算符:
	int a=200;
	int b=2;
	//+ *
	printf("%d\n",a+b*2);
	// %
	//printf("%d\n",2.1%2);	//error:%只能对整型
	//  /
	printf("%f\n",5.03);	
	char c=97;
	char d=200;
	
//	short result=a+c;	//char->int
	float result1=a+3.14;
	
	printf("%f %d\n",result1,sizeof(a+3.14));
}

算法:时间度,空间度.

#include<stdio.h>
int main()
{
//算法:1时间度  2空间度 
	//int temp;
	int a=1;
	int b=2;
	//temp=a;
	//a=b;
	//b=temp;
	//
	a=a+b;
	b=a-b;
	a=a-b;
	printf("%d %d\n",a,b);
}

按位右移 >> .

2的二进制是 0010 ,  右移一位为  0001 , 故len=1;

#include<stdio.h>
{
//右移 >>
	short a=2;
	short len=a>>1;
	printf("a=%d len=%d\n",a,len);
}

按位左移 << .

1的二进制是 0001 , 左移一位为 0010 , 故而len=2;

#include<stdio.h>
int main()
{
	short c=1;
//左移 <<
	len=c<<2;
	printf("c=%d len=%d\n",c,len);
}

按位与 & .    

#include<stdio.h>
int main()
{
// &   一一得1  一0得0  00得0
	short i=7;
	short j=2;
//初始化部分bit位值,或者除出子网数
	len=i&j;
	printf("i=%d j=%d len=%d\n",i,j,len);		
//4段点分十进制  192.168.8.59    【0-255】.【0-255】.[0,255].[0,255] 
//				   char       char    char     char=int
//ip=网络号+主机号				  			
// 192.168.8.59   
	unsigned int ip1=0xC0A8083A;	//[01][10][11]   [11]
					// 11  11  11  	  00
					// 01  10  11	  00
//取网络号 192 C 【网络号】【网络号】【网络号】.主机	
	unsigned int mask1=0xFFFFFF00;	//11111111 11111111 11111111 0000000
	unsigned int result=0;
	result=ip1&mask1;
	printf("len=%x\n",result);//0xc0A80800--->192.168.8
//18.124.8.26  
}

按位 或 |  .

#include<stdio.h>
int main()
{
//按位或  |   (一1得1) 1|1=1  1|0=1  0|0=0	

	short a=3;	//0011
	short b=12;
	short result=a|b;	// 0011
	printf("%d\n",result);	//|1100
				//-------
				// 1111 
}
#include<stdio.h>
int main()
{
	short a=45978;					// 101 100111 0011010
	unsigned short result=(a&0xe07f)|0x1580;	//&111 000000 1111111
	printf("%d\n",result);				// 
							// 101 000000 0011010
							//|000 101011 0000000 
}

输出: 46490

按位取反,按位异或.
#include<stdio.h>
int main()
{
//按位取反 ~a		(单目运算)
	//0->1  1->0
	unsigned short i=0xfff5; //2Byte=16bit 1111 1111 1111 0101
	unsigned short j=~i;	//	       0000 0000 0000 1010
	printf("%d\n",j); 
//按位异或 ^   两位相异则为1 1^1=0 1^0=1 0^1=1
	unsigned short a=10;			// 1010
	unsigned short b=5;			// 0101 
	unsigned short result=a^b;		// 1111 
	printf("%d\n",result);
}


习题:使用位运算执行的练习题:

        1、int a=1 ,int b=2交换a,b的值

                a=a+b;

                b=a-b;

                a=a-b;

第一种位方法:

#include<stdio.h>

int main()
{
int a = 1;
int b = 2;
a = a^b;
b = a^b;
a = b^a;
printf("%d %d\n",a,b);

}

第二种位方法:

        int a=1000;
	int b=2000;
	int c = ~a;
	int d = ~b;
	b = ~c;
	a = ~d;
	printf("%d %d\n",a,b);


习题:short a=45978;请将第8位至13位修改为110101,其他位保持不变。

#include<stdio.h>
int main()
{       
        unsigned short a = 45978;
	unsigned short b = 3;
	unsigned short len = b<<9;
	unsigned short result = a^len;
	printf("%d\n",result);
}


习题:坐标点 short[高x,低y]

        完成:1、将x,y的值分别存储到short point中[【x】【y】]。

                  2、将x,y的值分别出从point中取出。

#include<stdio.h>

int main()
{
        unsigned short x =10;
	unsigned short y =5;
	int point =0;	//【高x】【低y】

	point =(unsigned short)y;	//隐式类型转换
	point =point | x<<16;	//高位自动补0
	
	printf("%x\n",point);

	//取x,y的值
	y=point&0xff;
	x=(short)((point>>16)&0xff);

	printf("%d %d\n",x,y);
	return 0;
}


习题:通过三目运算符求:  int a=1,b=2,c=0;中的最大值。

#include<stdio.h>
int main()
{
	int a=12,b=8,c=20;
	int d = (a>b?a:b);
	int max = d>c?d:c;
	printf("%d\n",max);
}


习题:循环移位    00110011 >> 2   ==11001100

#include<stdio.h>

int main(){	
        while(1){
	unsigned char a = 51;
	unsigned char b = 204;
	int i = 0;
	for(i=0;i<1;i++){
 	unsigned char c = a>>1;
	unsigned char d = b<<1;
	unsigned char e = c|d;
	printf("%d\n",e);
	}
	unsigned char f = 153;
	unsigned char g = 102;
	int j = 0;
	for(j=0;j<1;j++){
	unsigned char h = f>>1;
	unsigned char k = g<<1;
	unsigned char l = h|k;
	printf("%d\n",l);
	}
	int z = 0;
	for(z=0;z<1;z++){
	unsigned char m = b>>1;
	unsigned char n = a<<1;
	unsigned char o = m|n;
	printf("%d\n",o);	
	}
	int y = 0;
	for(y=0;y<1;y++){
	unsigned char p = g>>1;
	unsigned char q = f<<1;
	unsigned char r = p|q;
	printf("%d\n",r);	
	}
}

猜你喜欢

转载自blog.csdn.net/superman___007/article/details/80969248
今日推荐