20160402_C语言位操作符的使用

  

  C语言的设计具备了汇编语言的运算能力,它支持全部的位操作符。

  位操作符是对字节或字中的位进行测试、置位或移位处理,在对微处理器的编程中,特别适合对寄存器、I/O端口进行操作。

  6种位操作符:

  (1) & :按位“与”——仅当两个操作数为1时,结果为1,否则为0。如:1000 1000  & 1000 0001  = 1000 0000;

  (2) | :按位“或”——仅当两个操作数为0时,结果为0,否则为1。如:1000 1000 | 1000 0001 = 1000 1001;

  (3) ^:按位“异或”——仅当两个操作数不同时,相应的输出结果才为1,否则为0。

如:1000 1000 ^ 1000 0001 = 0000 1001 ;

  (4) ~ :“取反”——把1置为0,0置为1。如:~1000 1000 = 0111 0111;

  (5) <<: “左移”——将变量的各位按要求向左移动若干位。如:0000 1000 <<3 = 0100 0000;

  (6) >>: “右移”——将变量的各位按要求向右移动若干位。如:0000 1000>>3=0000 0001;

  位运算符的应用:

  (1)直接交换两个变量的值

  例如,若有变量a = 3,b = 4,想要交换它们的值,可以做如下一组操作:

    a ^ = b  (a等于a异或b)

    b ^ = a  (b等于b异或a)

    a ^ = b  (a等于a异或b)

  首先,a ^ = b:

   a    0000 0011

  ^   b    0000 0100

   a =     0000 0111

  其次,b ^ = a:

  b    0000 0100

  ^   a    0000 0111

   b =     0000 0011

  最后,a ^ = b:

  a    0000 0111

  ^   b    0000 0011

   a =     0000 0100

  这样,a、b两个变量中的值就进行了对调。

  (2)快速乘除运算

  移位操作可用于整数的快速乘除运算,左移一位等效于乘2,而右移一位等效于除以2。

  如:x = 7, 二进制表达为:0000 0111,

  x < < 1               0000 1110,相当于: x =2*7=14,

  x < < 3               0111 0000,相当于: x=14*2*2*2=112

  x < < 2               1100 0000,             x= 192

  在作第三次左移时,其中一位为1的位移到外面去了,而左边只能以0补齐,因而便不等于112*2*2=448,而是等于192了。当x按刚才的步骤反向移动回去时,就不能返回到原来的值了,因为左边丢掉的一个1,再也不能找回来了:

  x > > 2              0011 0000,          x=48

  x > > 3              0000 0110            x=48/8=6

  x > > 1              0000 0011            x=6/2=3

  (3)将寄存器指定位置为1

  PORTA |= (1<<n)  将porta的第n为置为1,其他为不变。比如说,你如果想将第4位置1,就使用:

  PORTA | = (1<< 4) 就行了。当然,也可以使用:

  PORTA | = (1<< 7) | (1<< 4 ) | (1<< 0) 这样的指令一次将设第8、5和1位置1,但又不影响到其它位的状态。

  (4)将寄存器指定位置为0

  PORTA &= ~(1<<n )

  这条指令将寄存器的任意位清0,而又不影响其它位的现有状态。比如说,你如果想将第4位清0,就使用:

  PORTA & = ~ (1<< 4) 就行了。

下面是POJ 3748题,应用了位操作符:

/*
位操作

Description

假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),
将第Y位开始的连续三位设置成110(从高位到低位的顺序),而其他位保持不变。对给定的寄存器值R,及X,Y,
编程计算更改后的寄存器值R。
Input

仅一行,包括R,X,Y,以逗号","分隔,R为16进制表示的32位整数,X,Y在0-31之间且Y>=3,(Y-X)的绝对值>=3,保证两次置位不会重合
Output

更改后的寄存器值R(16进制输出)
Sample Input

12345678,0,3
Sample Output

1234567c
Source

*/

#include <stdio.h>

int main()
{
 int R, X, Y;

scanf("%x,%d,%d",&R,&X,&Y);

R &= ~(1<<X);       // 将R的第X位设置为0
 R |= (1<<Y);        // 将R的第Y位设置为1
 Y--;
 R |= (1<<Y);        // 将R的第Y-1位设置为1
 Y--;
 R &= ~(1<<Y);       // 将R的第Y-2位设置为0

printf("%x/n",R);

return 0;
}

时间: 2024-10-12 12:31:55

20160402_C语言位操作符的使用的相关文章

为什么不要在 JavaScript 中使用位操作符?

如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,Float,Double,Decimal 的.咳咳,我说的当然是在 ES6 之前的 JS,在 ES6 的新标准中提出了像 Int8Array 这样新的数据类型.不过这不是本文叙述的重点,暂且就不谈啦.本文将更着重地谈 JS 的数字类型以及作用于它的位操作符,而关于包装对象 Number 的更多了解可以

神奇的位操作符

相信学过C语言的小伙伴们都知道位操作符,正确的使用位操作符会让我们写出更高效率的程序 但不要忘记它也是有缺点的:只能用于整型和字符型数据. 速度:快于乘法 等同于加减法 *参与运算的数据以补码形式出现!(不要弄错啦!) eg: 数字 -1 原码:10000000 00000000 00000000 00000001 反码:11111111 11111111 11111111 11111110 补码:11111111 11111111 11111111 11111111 ***有符号数只改变数值部

【JavaScript】JavaScript位操作符

JavaScript位操作符 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值.ECMAScript 中的所有数值都以 IEEE-754 64 位格式存储,但位操作符并不直接操作 64 位的值.而是先将 64 位的值转换成 32 位的整数,然后执行操作,最后再将结果转换回 64 位.对于开发人员来说,由于 64 位存储格式是透明的,因此整个过程就像是只存在 32 位的整数一样. 对于有符号的整数,32 位中的前 31 位用于表示整数的值.第 32 位用于表示数值的符号:0 表示正数

几种常用过的按位操作符技术

控制硬件时常涉及到打开/关闭特定的位或查看它们的状态.按位操作符(<<,>>,~,&,|,^)提供了这种能力.下面的例子中,lottabits表示一个值,bit表示特定位的值.位从右到左进行编号,从0开始,因此,第n位的值为2的n次方(通常情况下只有一位为1,这是为了简洁处理).例如,只有第3位为1的整数的值为2的3次方.(<C++ Primer Plus>附录E) 1.打开位  //打开位,将打开lottabits中对应于bit表示的位  lottabits=

前端学习笔记之六——JS位操作符练习题

作业题如下: -------------------------------------------------- 位操作符还不是很熟悉,借助这个题正好补一下. 十进制转二进制方法:将十进制数除以2取第一个余数,然后用商不断除以2,不断取第二.第三个……余数,直到商为0时止,然后将第一个.第二个……从右向左排列,高位补0. 二进制转十进制方法:从二进制数最右边的数开始,从左至右,每位数依次乘以2的0次方.2的1次方.2的2次方,然后将这些乘方结果相加,即为十进制数. 所以,本道题十进制22转为二

利用位操作符加速程序的运行

众所周知,位操作是cpu里面最快速的操作之一.但是以前在程序中,一直没有使用,可能是害怕异或是别的什么原因.可是最近在写一个小的爬虫,但是却需要爬取百万级数据,这时候想到了位操作符. 先来2个程序对比一下: 程序1: 1 #coding:utf-8 2 3 import time 4 import datetime 5 6 pagesNum = 0 7 8 def getLinks(): 9 global pagesNum 10 for i in range(0,0xfffffff): 11 p

C++位操作符总结

1 #include <stdio.h> 2 #include <memory.h> 3 #include <malloc.h> 4 #define MaxBinLength 16 5 6 //获取无符号数的二进制,这是我自己写的,更简单的方法可以用bitset代替 7 char* getUnsignedBinary(unsigned int num) 8 { 9 int len = MaxBinLength -1; 10 char *bin = (char*)mall

Java的按位操作符

本文参考:Java的位操作符 Java的位操作符用来操作整数基本数据类型中的单个"比特"(bit),即代进制位.而我们知道比特就是0和1,那么,位操作就是对这些数据进行基本的操作.如果基本类型是char.byte或者short类型的数值进行移位处理,那么会转化成int类型,再进行移位的处理 Java的按位操作符 按位操作符会对两个参数对应的位执行布尔代数运算,并最终生成一个结果.这个操作符有与(&).非(~).或(|).异或(^).我们知道单位"比特"(bi

C语言位运算符:与、或、异或、取反、左移和右移

语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. C语言提供的位运算符列表:运算符 含义 描述& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1~ 取反 ~