位运算之指定位操作

原创 2016年05月30日 13:28:50

# 题目: 实现对一个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;
}



一天感觉时间不够用!

版权声明:本文为博主原创文章,未经博主允许不得转载。

一些位操作函数

 转自http://www.hseda.com/mcu/cbitop.htm#define uchar unsigned char/*测试变量某一位是否为‘1’,是返回真,否返回假,num为待测试的数...
  • bingyan123456
  • bingyan123456
  • 2006年03月31日 20:58
  • 599

MATLAB的位运算操作

在MATLAB中想要直接对类似于c、c++中的位运算操作,即或‘|’、与‘&’、非‘~’操作,如果直接写成Result = anynum & 0xff; %错误示范在matlab中会把0xff认为...
  • kabuto_hui
  • kabuto_hui
  • 2015年11月15日 22:43
  • 2430

stm32位操作函数(未完待续)

stm32位操作函数 昨天看到了普中科技的数码管操作函数,对stm32的位操作函数,自己也不太懂,就查了一下,现在整理学习笔记如下: 主要学习到了stm32操作函数的两个位操作函数,现在我们用寄存器和...
  • zhanghuaichao
  • zhanghuaichao
  • 2015年11月22日 12:46
  • 1019

C语言一些常用的“位”操作函数

这些函数操作“位”,经常用到: //将双字节中某一位置位 void SetN1(unsigned short *pBuf, int n) { (*pBuf) |= 1...
  • dijkstar
  • dijkstar
  • 2012年04月01日 21:40
  • 9172

位运算在算法题中的使用(C++)

一、算术运算符和位运算符 算术运算符:+、-、*、/、% 位运算符:&按位与、|按位或、^按位异或、~按位取反、>右移左侧补符号位、 >>>右移左侧补0 注意:移位运算一定要赋值。也就是说将a左移2位...
  • DjangoBUAA
  • DjangoBUAA
  • 2016年04月20日 14:36
  • 1729

位运算的常见操作和题目

一、位运算基本操作 &          与            1 & 1 = 1;1 & 0 = 0;0 & 0 = 0  只有当两个位都为1时,结果为1 |   ...
  • u013074465
  • u013074465
  • 2015年06月29日 21:04
  • 2645

位运算符(&【按位与】,|【按位或】,^按位异或,~【按位取反】,<<【向左移动】,>>【向右移动】)

位运算 在这里,将小结一下位运算符的运算,废话就不这么多了 位运算符有按位与(&),按位或(|),按位异或(^),按位取反(~),向左移动(>) 现在给出两个变量,$m=8,$n=12;问:...
  • pan_xi_yi
  • pan_xi_yi
  • 2015年05月23日 13:02
  • 1386

有符号char的+、-法位运算过程

有符号short的+、-法位运算过程 由2个bytes (8个bits,从左,往右数,左边4bits称:高8位,右边4bits称:低8位) 高位byte的第4个bit作为是否负数的标识,0:...
  • linjf520
  • linjf520
  • 2015年08月01日 14:05
  • 628

java 位运算符及char、byte转换详解

java中的位运算符不外乎三种:《左移,》(带符号右移)和>>>(无符号右移) 1.左移运算符    1)《使指定值的所有位都左移规定的次数。 value左移的规则只记住一点,丢弃最高位,0补最低位。...
  • qq_17641373
  • qq_17641373
  • 2015年02月28日 14:04
  • 832

黑马程序员IOS-C语言-进制、位运算、char

------- android培训、java培训、期待与您交流! ---------- ---------------------------------------------------- ...
  • u014749033
  • u014749033
  • 2015年04月06日 22:45
  • 97
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:位运算之指定位操作
举报原因:
原因补充:

(最多只允许输入30个字)