【学习笔记】【C语言】位运算

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

1. & 按位与1> 功能

只有对应的两个二进位均为1时,结果位才为1,否则为0。

2> 举例: 比如9&5,其实就是1001&101=1,因此9&5=1

3> 规律

二进制中,与1相&就保持原位,与0相&就为0

2. | 按位或1> 功能

只要对应的二个二进位有一个为1时,结果位就为1,否则为0。

2> 举例: 比如9|5,其实就是1001|101=1101,因此9|5=13

3. ^ 按位异或1> 功能

当对应的二进位相异(不相同)时,结果为1,否则为0。

2> 举例: 比如9^5,其实就是1001^101=1100,因此9^5=12

3> 规律

相同整数相^的结果是0。比如5^5=0

多个整数相^的结果跟顺序无关。比如5^6^7=5^7^6

因此得出结论:a^b^a = b

4. ~ 取反对整数a的各二进位进行取反,符号位也取反(0变1,1变0)

5. << 左移把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方

由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性

6. >> 右移把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方

为正数时, 符号位为0,最高位补0

为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定

7.学习代码

1#include <stdio.h>234intmain()5{6/*按位与 &781010101000090000010000010-------------1100000000000121310111011141010110115---------16101010011718100119010120-----21000122*/2324/*25按位或 |26100127010128-----29110130*/313233/*34按位异或 ^351.相同数值进行异或,结果肯定是0,比如9^9362.交换 9^5^6 == 9^6^5373.任何数值跟0进行异或,结果还是原来的数值,9^0 == 9384.a^b^a == a^a^b == 0^b == b3940100141010142-----4311004445100146100147-----48000004950010151000052----53010154559^5^9 == 9^9^5 = 0^5 = 55657a^b^a == b58*/59//PRintf("%d\n", 9^9);6061//printf("%d\n", 9 ^ 5);6263/*64按位取反 ~65~0000 0000 0000 0000 0000 0000 0000 1001661111 1111 1111 1111 1111 1111 1111 011067*/68//printf("%d\n", ~9);6970/*71左移 <<72730000 0000 0000 0000 0000 0000 0000 00007400 0000 0000 0000 0000 0000 0000 10010075769<<1 -> 9 * 2的1次方 == 18779<<2 -> 9 * 2的2次方 ==36789<<n -> 9 * 2的n次方79*/8081//printf("%d\n", 9<<1);8283/*84右移 >>850000 0000 0000 0000 0000 0000 0000 000086000000 0000 0000 0000 0000 0000 0000 1087111111 1111 1111 1111 1111 1111 1111 1088898>>1 -> 8/2 == 4908>>2 -> 8/2的2次方 == 2918>>n -> 8/2的n次方92*/9394printf("%d\n",8>>3);9596return0;97}

1#include <stdio.h>23/*4使用位异或运算符交换两个变量的值5*/67intmain()8{9inta =10;10intb =11;1112/*借助第三方变量13int temp = a;14a = b;15b = temp;16*/1718/*19a = b - a;20b = b - a;21a = b + a;22*/2324//a^b^a == b2526//a --> 10^1127//b --> 1028a = a ^b;29b = a ^b;30a = a ^b;3132printf("a=%d, b=%d\n", a, b);3334return0;35}

1#include <stdio.h>2/*3用位与&运算符判断变量的奇偶性4*/5intmain()6{7/*815: 111199: 1001101114: 11101210: 101013*/14inta =15;1516a&1==1//奇数17a&1==0//偶数1819/*20if (a%2) {21printf("奇数\n");22} else {23printf("偶数\n");24}*/2526//a%2==0?printf("偶数\n"):printf("奇数\n");2728//a%2?printf("奇数\n"):printf("偶数\n");29303132return0;33}

1/*2写一个函数,用来输出整数在内存中的二进制形式3*/45#include <stdio.h>6voidprintBinary(intnumber);78intmain()9{10/*110000 0000 0000 0000 0000 0000 0000 0000120000 0000 0000 0000 0000 0000 0000 111113149 : 0000 0000 0000 0000 0000 0000 0000 100115-10 : 1111 1111 1111 1111 1111 1111 1111 011016*/171819//printf("%d\n", ~9);202122printBinary(-10);23return0;24}2526voidprintBinary(intnumber)27{2829//记录现在挪到第几位30//(sizeof(number)*8) - 1 == 3131inttemp = (sizeof(number)<<3) -1;3233while( temp >=0)34{35//先挪位,再&1,取出对应位的值36intvalue = (number>>temp) &1;37printf("%d", value);3839//40temp--;4142//每输出4位,就输出一个空格43if( (temp +1) %4==0)44{45printf("");46}47}4849printf("\n");50}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航