位运算之指定位操作

原创 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;
}



一天感觉时间不够用!

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

相关文章推荐

位运算与乘法速度比较

【IT168 编程开发】这里我主要和大家一起讨论乘法与位运算。一直以来,很多人都认为位运算要比乘法执行效率高,我一直也是这样认为的,但是真的是这样的吗?让我们看下面的代码:   p...

统计一个整数的二进制中1的个数(位运算技巧)

下面函数完成的功能就是统计一个二进制整数中1的个数; while循环:在number等于0时循环结束,否则一直循环。int CountNumberOfOne(int number) { ...

C# 位运算 位操作 教程

在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。   C# 中支持的位操作符号有:   ...

java 位运算(位操作)

Java中的位操作指定包括: ~                    按位非(NOT) &                   按位与(AND) |                    按位...
  • Hollboy
  • Hollboy
  • 2012年04月13日 13:48
  • 657

位运算操作

  • 2013年07月20日 19:18
  • 36KB
  • 下载

总结一下java中的位操作,运算优先级

总结一下java中的位操作java中有很多位操作,如移位,异或,与或非等。 移位向左移,二进制的结尾就直接用0来补全了 向右移,有两种情况 开头以符号位补全(负数就是用1补全) 开头以0补全int m...

位操作的运算

int divide(int dividend, int divisor) { if (!divisor || (dividend == INT_MIN && divisor == -...

Java位操作运算

移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:>(带符号右移)和>>>(无符号右移)。   在移位运算时,byte、short和char类型移位后的结果会变成i...

JAVA<位操作运算>

package alibaba;public class Test { public static void main(String[] args) { // int在Java...
  • Gpwner
  • Gpwner
  • 2017年03月05日 13:37
  • 540

按位操作运算

.在了解位移之前,先了解一下正数和负数的二进制表示形式以及关系: 举例15和-15: 15的原码: 00000000 00000000 00000000 00001111     补码: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:位运算之指定位操作
举报原因:
原因补充:

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