【无标题】

小练笔

【1】请编码实现以下功能的函数
功能:实现对一个8 bit数据(unsigned char类型)的指定位(例如第n位)的置0或者置1操作,并保持其他位不变。
函数原型:
void bit_set(unsigned char *p_data, unsigned char position, bool flag)
函数参数说明:
p_data 是指定的源数据,position是指定位(取值范围1~8);flag表示是置0还是置1操作,true: 置1 flase:置0

问题分析

二进制位的转换可以利用位运算进行:
0000 0001B | 0000 00 10B=0000 0011B
0000 0001B & ~(0000 0001)B =0000 0000B

代码;

void bit_set(unsigned char *p_data, unsigned char position, bool flag)
{
	if(flag)
	{
		//置1
		*p_data |= (0x01<<(position-1));
	}
	else
	{
		//置0
		*p_data &= ~(0x01<<(position-1));
	}
}
void main()
{
	unsigned char value = 10;
	unsigned char pos = 3;
	bool flag = false;
	bit_set(&value, pos, flag);
}

【2】
将给定的一个数组进行换位操作,例如;arr[6]={1,2,3,4,5,6},k=3(将后三位进行移动后)arr[6]={4,5,6,1,2,3}.

问题分析

将数组a ={ 1 2 3 4 5 6 } 分解为a1={1 2 3}, a2={4 5 6},
将各自数组进行对调;a1={3 2 1},a2={6,5,4},
再合并对调,a={3 2 1 6 5 4} -> {4 5 6 1 2 3}
即可完成操作。
代码

void rotate(int* nums, int numsSize, int k)
{
	k %= numsSize;

	for(int i=0; i<k; ++i)
	{
		int tmp = nums[numsSize-1];
		for(int j=numsSize-1; j>0; --j)
		{
			nums[j] = nums[j-1];
		}
		nums[0] = tmp;
	}
}

void main()
{
	int ar[] = {1,2,3,4,5,6,7,8};
	int n = sizeof(ar) / sizeof(ar[0]);
	rotate(ar, n, 3);
}

你可能感兴趣的:(算法)