位运算(1)解读
- 格式:ppt
- 大小:105.50 KB
- 文档页数:7
什么是位(bit)?很简单,位(bit)就是单个的0或1,位是我们在计算机上所作一切的基础。
计算机上的所有数据都是用位来存储的。
一个字节(BYTE)由八个位组成,一个字(WORD)是二个字节或十六位,一个双字(DWORD)是二个字(WORDS)或三十二位。
如下所示:0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0| | | | | | || +- bit 31 | | | bit 0 -+ || | | | |+-- BYTE 3 ---- -+---- BYTE 2 ---+---- BYTE 1 ---+--- BYTE 0 -----+| | |+------------ WORD 1 ------------+----------- WORD 0 -------------+| |+----------------------------- DWORD -----------------------------+使用位运算的好处是可以将BYTE, WORD 或DWORD 作为小数组或结构使用。
通过位运算可以检查位的值或赋值,也可以对整组的位进行运算。
16进制数及其与位的关系用0或1表示的数值就是二进制数,很难理解。
因此用到16进制数。
16进制数用4个位表示0 - 15的值,4个位组成一个16进制数。
也把4位成为半字节(nibble)。
一个BYTE有二个nibble,因此可以用二个16进制数表示一个BYTE。
如下所示:NIBBLE HEX V ALUE====== =========0000 00001 10010 20011 30100 40101 50110 60111 71000 81001 91010 A1011 B1100 C1101 D1110 E如果用一个字节存放字母"r "(ASCII码114),结果是:0111 0010 二进制7 2 16进制可以表达为:'0x72 '有6种位运算:& 与运算| 或运算^ 异或运算~ 非运算(求补)> > 右移运算< < 左移运算与运算(&)双目运算。
位运算详解(1)、按位与(&),将两个操作数化为⼆进制后并将对应的每⼀位分别进⾏逻辑与操作。
(a%(2^n)=a&(2^n-1))(2)、按位或(|),将两个操作数化为⼆进制后并将对应的每⼀位分别进⾏逻辑或操作。
(3)、按位异或(^),和以上同,异或是指对应位相同则运算结果为0,否则为1。
(4)、按位取反(~),对每⼀位进⾏取反。
(求x的相反数:x=(~x+1))(5)、移位。
分为左移(<<)和右移(>>),左移是按照指定的位数将⼀个数的⼆进制值向左移位,左移后,低位补0,移除的⾼位舍去,右移相反。
等价转换:a<<n=a*(2^n),a>>n=a/(2^n)。
#include<iostream>using namespace std;int n=7,m=9;int main(){ cout<<(n&m)<<endl;/********************7: 0 0 0 0 0 1 1 19:(&) 0 0 0 0 1 0 0 1_____________________0 0 0 0 0 0 0 1所以输出结果为1。
********************/cout<<(n|m)<<endl; //输出(1111)2=15cout<<(n&1)<<endl; //判断⼀个数是否为奇数,n&1=1则为奇数,否则为偶数cout<<(~n)<<endl; //(11111000)2=-8,前⾯的的1为符号位cout<<(n^m)<<endl; //(1110)2=14cout<<(n<<2)<<endl; //(11100)2=28cout<<(m>>2)<<endl; //(10)2=2n=n^m,m=m^n,n=n^m; //可以⽤来交换两个数值/**********************************n=n^m,所以m=m^n=m^(n^m)=(m^m)^n=7n=n^m=(n^m)^(m^m)^n=(n^n)^(m^m)^m=9**********************************/cout<<n<<" "<<m<<endl;return 0;}位运算的应⽤:求平均值:求(x+y)/2时,可能x+y会超过int的最⼤值,可以⽤位运算来求:int Ave(int x,int y){ return x&y+((x^y)>>1);}判断⼀个数是否能够写成2的幂次⽅形式。
位运算——摘自百度百科/view/379209.htm程序中的所有数在计算机内存中都是以二进制的形式储存的。
位运算说穿了,就是直接对整数在内存中的二进制位进行操作。
比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。
举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
目录简介Pascal和C中的位运算符号各种位运算的使用运算结果位运算的简单应用整数类型的储存进阶介绍进阶介绍二实战展开简介110AND 1011---------------0010 --> 2由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。
当然有人会说,这个快了有什么用,计算6 and 11没有什么实际意义啊。
这一系列的文章就将告诉你,位运算到底可以干什么,有些什么经典应用,以及如何用位运算优化你的程序。
Pascal和C中的位运算符号下面的a和b都是整数类型,则:C语言 | Pascal语言-------+-------------a&b | a and ba|b | a or ba ^b | a xor b~a | not aa << b| a shl ba >>b | a shr b注意C中的逻辑运算和位运算符号是不同的。
520|1314=1834,但520||1314=1,因为逻辑运算时520和1314都相当于True。
同样的,!a和~a也是有区别的。
各种位运算的使用=== 1. and运算 ===and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位。
这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数.相同位的两个数字都为1,则为1;若有一个不为1,则为0。
位运算符讲解
位运算符是计算机编程中的一种基本运算符,主要用于对二进制位进行操作。
常见的位运算符包括位与(&)、位或()、位异或(^)、按位取反(~)以及位移运算符(<<、>>)。
1. 位与(&):这个运算符会对两个数的二进制位进行与运算。
只有当两个相
应的二进制位都为1时,结果位才为1,否则为0。
2. 位或():这个运算符会对两个数的二进制位进行或运算。
只要有一个相应的二进制位为1,结果位就为1,否则为0。
3. 位异或(^):这个运算符会对两个数的二进制位进行异或运算。
如果两个
相应的二进制位值相同则结果位为0,否则为1。
4. 按位取反(~):这个运算符会对一个数的二进制位进行取反操作,即将1
变为0,将0变为1。
5. 左移(<<):这个运算符会将一个数的二进制位左移指定的位数,右边空
出的位用0填充。
6. 右移(>>):这个运算符会将一个数的二进制位右移指定的位数,左边空
出的位用符号位的值填充。
7. 无符号右移(>>>):这个运算符类似于右移运算符,但左边空出的位用0填充。
这些位运算符在计算机科学中有广泛的应用,例如在处理二进制数据、优化内存使用、实现加密算法等方面。