关闭

位运算之指定位操作

标签: 位运算
1191人阅读 评论(0) 收藏 举报
分类:

# 题目: 实现对一个8Bit数据(unsigned char类型)的指定位(例如第n位)的置0或者置1操作,并保持其他位变。



@ 函数原型unsigned char _operator_bit(unsigned char data, int pos, int flag);


@题目分析:运用 移位运算符(>>),按位取反(~),按位与(&),按位或(|)等运算符;

/*

@思路分析: 想要只改变bit位的某一位,例如:0000 0011 想要把第3位变成1,那么我们只需要

给第三位或上一个1就可以了,变成:0000 0111;那么如果想要把第2位变成0, 那么我们只要

给第二位与上一个 0,变成:0000 0001;就可以了;

这就要用到我们熟悉的位运算符了; 首先我们想到的最简单的就是用定义一个1去与元数据进行位操作运算;

那么,我们试一下;0000 0011 要把第三位变成1,那么 0000 00001 就得先向左移动2位变成:

0000 0100;然后和 0000 0011 进行按位或 就得到结果;0000 0111 ;而如果是把第二位的1变成0,

把:0000 0011 变成0000 0001, 那么,继续和第一次的操作一样的话,0000 0001 左移一位,变成

0000 0010,和0000 0011 按位或得到 0000 0011,没有变化,那么就有问题了,我们再试试,将

0000 0010 按位取反:1111 1101,再与 0000 0011 按位与得到:0000 0001,就是我们想要的结果了;

好了,嘴上的功夫完了,下面就是手底下的功夫了;

*/

# 算法流程图:op就是我们定义的 1;data就是要操作的那8bit数;flag表示将指定位置为0,还是1;

pos表示指定位!



@代码实现:

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

unsigned int _operator_bit(unsigned char data, int pos, int flag)
{
	int op = 1;
	//if(pos < 1 || pos > 8)
	//	return ; if判断的话返回值不好弄,那就直接用assert函数;

	assert(pos>=1 && pos<=8);

	op<<=(pos - 1);

	if(flag == 1)
		data = data | op;
	if(flag == 0)
		data = data & ~op;

	return data;
}

int main()
{
	unsigned char num = 2;
	int flag = 1;
	int pos = 8;

	num = _operator_bit(num,pos,flag);
	printf("%d\n",num);

	system("pause");
	return 0;
}



一天感觉时间不够用!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:125417次
    • 积分:2519
    • 等级:
    • 排名:第15226名
    • 原创:113篇
    • 转载:4篇
    • 译文:0篇
    • 评论:59条
    博客专栏
    最新评论