c语言中位运算符及用法 |
您所在的位置:网站首页 › c语言位运算技巧 › c语言中位运算符及用法 |
位 运 算
一直对位运算头疼,在此总结一下
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。运位算包括位逻辑运算和移位运算,位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。 计算机内部是以补码形式存放数值的。 C语言提供了六种位运算 位运算符含义举例&(and)按位与a&b| ( or )按位或a|b^ ( xor )按位异或a^b~ ( not )按位取反~a>1位逻辑运算规则 aba&ba|ba^b~a~b00000110 10111010011011111000假设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.左移运算符 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |