c语言中位运算符及用法
位 运 算
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。运位算包括位逻辑运算和移位运算,位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。
计算机内部是以补码形式存放数值的。
C语言提供了六种位运算
位运算符 | 含义 | 举例 |
&(and) | 按位与 | a&b |
| ( or ) | 按位或 | a|b |
^ ( xor ) | 按位异或 | a^b |
~ ( not ) | 按位取反 | ~a |
<< ( shi ) | 左移 | a<<1 |
>> ( shr ) | 右移 | a>>1 |
位逻辑运算规则
a | b | a&b | a|b | a^b | ~a | ~b |
0 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 | 0 | 0 | 0 |
假设a,b为整型的数据,并且设a=15(等于二进制数00000000 00001111),b=80(等于二进制数 00000000 01010000)
a的补码:00000000 00001111
b的补码:00000000 01010000
————————
a&b: 00000000 00000000 a&b=0x0
a|b : 00000000 01011111 a|b=0x5f
a^b : 00000000 01011111 a^b=0x5f
~a : 11111111 11110000 ~a=0xfff0
位运算应用口诀
清零取反要用与,某位置一可用或
若要取反和交换,轻轻松松用异或
1.“按位与”运算符&
运算规则:参加运算的两个运算量,如果两个数相应位的值都是1,则该位的结果值为1,否则为0。即:0 & 0 =0;0 & 1 =0;1 & 0 =0;1 & 1 =1。
(1)将某些二进制位屏蔽掉(保留一个数据中的某些位)。
如果要使整数k的低四位置零,保留其它位。用位与运算即可,将的高字节与0相与,低字节与1相与;
代码如下:unsigned int_set(unsigned int k)
{k=k&0x1110;
Return(k);}
例】00101010 01010010&11111111 11110000=00101010 01010010。
结论:任何二进制位与0能实现置0;与1保持原值不变
(2)判断一个数据的某一位是否为1。
如判断一个整数a(2个字节)的最高位是否为1,可以设一个与a同类型的测试变量test,test的最高位为1,其余位均为0,即int test=0x8000。
【例】 0100010011111110&1000000000000000=0 说明最高位为0;
1100010011111110&1000000000000000=1000000000000000 说明最高位为1;
例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数.
2.“按位或”运算符|
常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)
运算规则:参加运算的两个运算量,如果两个数相应位的值都是0,。即:0 | 0 =0;0 | 1 =1;1 | 0 =1;1 | 1 =1
把一个数据的某些位置为1。
如果把a的第10位置为1,而且不要破坏其它位,可以对a和b进行“按位或”运算,其中b的第10位置为1,其它位置为0,即int b=0x400。
【例】00100000 01010010|00000010 00000000=00100010 01010010。
3.“按位异或”运算符^
运算规则:参加运算的两个运算量,如果两个数的相应位的值不同,则该位的结果值为1,否则为0。即:0 ^ 0 =0;0 ^ 1 =1;1 ^ 0 =1;1 ^ 1 =0
应用举例:
(1)把一个数据的某些位翻转,即1变为0,0变为1。
如要把a的奇数位翻转,可以对a和b进行“按位异或”运算,其中b的奇数位置为1,偶数位置为0,即int b=0xaaaa。
【例】a的补码:00000000 01010010
b的补码: 01010101 01010101
^ -------------------
结果的补码: 01010101 00000111
(2)交换两个值,不用临时变量。
【例】a=3,b=4。想将a和b的值互换,可以用以下三条赋值语句实现:
a=a^b;即:a=3^4=7(0011^0100=0111)
b=b^a;即:b=4^7=3(0100^0111=0011)
a=a^b;即:a=7^3=4(0111^0011=0100)
不用temp交换两个整数
void swap(int x , int y)
{
x ^= y;
y ^= x;
x ^= y;
}
编写对字符串进行密钥匙异或加解密程序
有了加密程序(a^b),相应的就应该有解密程序。解密程序是加密程序的逆过程,这里的加密和解密程序是完全相同的,原因是(a^b)^b=a。
4.“按位取反”运算符~
移位运算符:
左移、右移运算实现将一个数的各个二进制位向左向右移若干位。
1.左移运算符<<
运算规则:对运算符<<左边的运算量的每一位全部左移右边运算量表示的位数,右边空出的位补0。
【例】a<<2表示将a的各位依次向左移2位,a的最高2位移出去舍弃,空出的低2位以0填补。
例:char a=0x21;
则a<<2的过程 0010 0001〈〈2 = 1000 0100;即 a<<2的值为0x84。
左移1位相当于该数乘以2,左移n位相当于该数乘以2n。
乘法运算转化成位运算 (在不产生溢出的情况下)
a * (2^n) 等价于 a<< n
2. 右移运算符>>
运算规则:对运算符>>左边的运算量的每一位全部右移右边运算量表示的位数,右边低位被移出去舍弃掉,空出的高位补0还是补1,分两种情况:
(1)对无符号数进行右移时,空出的高位补0。这种右移称为逻辑右移。
(2)对带符号数进行右移时,空出的高位全部以符号位填补。即正数补0,负数补1。这种右移称为算术右移。
右移1位相当于除以2,同样,右移n位相当于除以2n。
除法运算转化成位运算 (在不产生溢出的情况下)
a / (2^n) 等价于 a>> n
取模运算转化成位运算 (在不产生溢出的情况下)
a % (2^n) 等价于 a & (2^n - 1)
循环移位的实现。
如将一个无符号整数x的各位进行循环左移4位的运算,即把移出的高位填补在空出的低位处。
可以用以下步骤实现:
(1)将x左移4位,空出的低4位补0,可通过表达式x<<4实现。
(2)将x的左端高4位右移到右端低4位,可通过表达式x>>(16-4)实现。由于x为无符号整数,故空出的左端补0。
(3)将上述两个表达式的值进行按位或运算,即:
y=(x<<4) | (x>>(16-4));
x 0010 1111 0010 0001
x<<4 1111 0010 0001 0000
x>>(16-4) 0000 0000 0000 0010
y 1111 0010 0001 0010
unsigned rol ( unsigned a,int n)
{ unsigned b ;
b=(a<<n) | (a>>(16-n)) ;
return(b);}
计算绝对值
int abs( int x )
{ int y ;
y = x >> 31 ;//二进制最高位
return (x^y)-y ; //or: (x+y)^y
}
c语言中位运算符及用法相关推荐
- 常见位操作及运算应用举例:1,C语言中位运算符异或“∧”的作用2,异或运算的作用3,(与运算)、|(或运算)、^(异或运算)
1 C语言中位运算符异或"∧"的作用: 异或运算符∧也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即0∧0=0,0∧1=1,1∧1=0 ...
- C语言中位运算符有哪些
C语言中位运算符有: 位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运 ...
- C语言中 二进制有哪几个运算符 (举例),C语言中位运算符有哪些
前言继承是OOP设计中的重要概念.在C++语言中,派生类继承基类有三种继承方式:私有继承(private).保护继承(protected)和公有继承(public).一.继承规则继承是C++中的重要特 ...
- 转: C语言中位运算符异或“∧”的作用
转自: http://blog.sina.com.cn/s/blog_74a459380101d6xl.html 异或运算符∧也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假): ...
- c语言位运算负数的实例_一招教你学会C语言中位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...
- C语言中位运算异或“∧”的作用
前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. 1.概念 异或运算符"∧"也称XOR运算符.它的规则是 ...
- c语言中字符进行按位与,c语言位运算符的用法
C语言中位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果.下面小编就为大家介绍下c语言位运算符的用法. c语言位运算符的用法 ...
- c语言位与运算的作用,c语言位运算符的用法
c语言位运算符的用法 C语言中位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果.下面小编就为大家介绍下c语言位运算符的用法. ...
- c语言中的运算符及其含义_按位运算符及其在C语言中与Example一起使用
c语言中的运算符及其含义 1)&(按位与) (1) & (bitwise AND)) It does AND on every bit of two numbers. The resu ...
- c语言中 amp amp 是位运算符吗,c语言位运算符(c语言位运算符的用法举例)
C语言中的按位运算符 & | ^ ~ > 分别要怎么用?哪位大虾能详细讲解一下!!. 1.按位运算符就是直接对整数在内存中的二进制位进行操作运算.比如,&&运算本来是一个 ...
最新文章
- Makefile (2) gdb
- 哈哈哈,这个教人写烂代码的项目在 GitHub 上火了...
- python入门教程共四本书籍-Python入门经典书籍有哪些?有这三本就够了
- php从内存中获取源码_【PHP7源码分析】PHP内存管理
- 解决.NET CF 3.5 Bitmap(Stream)未处理异常问题
- python报错ordinal not in range(128)
- 【转载】ESFramewor使用技巧(2)-- 在插件中使用NHibernate
- 01-几种应用上下文区别
- Homebrew 安装使用
- 201521123014 《Java程序设计》第11周学习总结
- RTMP协议学习笔记
- DSP定点与浮点计算
- python反转数字_[蓝桥杯]使用列表反转的回文数(Python代码),数字,利用,取反
- 视频教程-大学数学实验(MATLAB版)-其他
- 新库上线 | CnOpenData制造业工商注册企业基础信息数据
- linux---常用命令(二)
- 无线通信与生活-(1)
- Short Pairing-based Non-interactive Zero-Knowledge Arguments
- 【SwiftUI学习笔记】Git Repository Creation FailedEnsure the author information supplied in Xcode ...
- GoshawkDB:一个分布式、支持事务与容错的对象存储