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

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>
 2 
 3 
 4 int main()
 5 {
 6     /* 按位与 &
 7      
 8      10101010000
 9      00000100000
10      -------------
11      00000000000
12      
13      10111011
14      10101101
15      ---------
16      10101001
17      
18      1001
19      0101
20      -----
21      0001
22      */
23     
24     /*
25      按位或 |
26      1001
27      0101
28      -----
29      1101
30      */
31     
32     
33     /*
34      按位异或 ^ 
35      1.相同数值进行异或,结果肯定是0,比如9^9
36      2.交换 9^5^6 == 9^6^5
37      3.任何数值跟0进行异或,结果还是原来的数值,9^0 == 9
38      4.a^b^a == a^a^b == 0^b == b
39      
40      1001
41      0101
42      -----
43      1100
44      
45      1001
46      1001
47      -----
48      00000
49      
50      0101
51      0000
52      ----
53      0101
54      
55      9^5^9 == 9^9^5 = 0^5 = 5
56      
57      a^b^a == b
58      */
59     //printf("%d\n", 9^9);
60     
61     //printf("%d\n", 9 ^ 5);
62     
63     /*
64      按位取反 ~
65      ~0000 0000 0000 0000 0000 0000 0000 1001
66       1111 1111 1111 1111 1111 1111 1111 0110
67      */
68     //printf("%d\n", ~9);
69     
70     /*
71      左移 <<
72      
73      0000 0000 0000 0000 0000 0000 0000 0000
74      00 0000 0000 0000 0000 0000 0000 100100
75      
76      9<<1 -> 9 * 2的1次方 == 18
77      9<<2 -> 9 * 2的2次方 ==36
78      9<<n -> 9 * 2的n次方
79      */
80     
81     //printf("%d\n", 9<<1);
82     
83     /*
84      右移 >>
85      0000 0000 0000 0000 0000 0000 0000 0000
86      000000 0000 0000 0000 0000 0000 0000 10
87      111111 1111 1111 1111 1111 1111 1111 10 
88      
89      8>>1 -> 8/2 == 4
90      8>>2 -> 8/2的2次方 == 2
91      8>>n -> 8/2的n次方
92      */
93     
94     printf("%d\n", 8>>3);
95     
96     return 0;
97 }
 1 #include <stdio.h>
 2 
 3 /*
 4  使用位异或运算符交换两个变量的值
 5  */
 6 
 7 int main()
 8 {
 9     int a = 10;
10     int b = 11;
11     
12     /* 借助第三方变量
13     int temp = a;
14     a = b;
15     b = temp;
16     */
17     
18     /*
19     a = b - a;
20     b = b - a;
21     a = b + a;
22     */
23     
24     // a^b^a == b
25     
26     // a -->  10^11
27     // b -->  10
28     a = a ^ b;
29     b = a ^ b;
30     a = a ^ b;
31     
32     printf("a=%d, b=%d\n", a, b);
33     
34     return 0;
35 }
 1 #include <stdio.h>
 2 /*
 3  用位与&运算符判断变量的奇偶性
 4  */
 5 int main()
 6 {
 7     /*
 8      15: 1111
 9      9:  1001
10      
11      14: 1110
12      10: 1010
13      */
14     int a = 15;
15     
16     a&1 == 1 // 奇数
17     a&1 == 0 // 偶数
18     
19     /*
20     if (a%2) {
21         printf("奇数\n");
22     } else {
23         printf("偶数\n");
24     }*/
25     
26     //a%2==0?printf("偶数\n"):printf("奇数\n");
27     
28     //a%2?printf("奇数\n"):printf("偶数\n");
29     
30     
31     
32     return 0;
33 }
 1 /*
 2 写一个函数,用来输出整数在内存中的二进制形式
 3 */
 4 
 5 #include <stdio.h>
 6 void printBinary(int number);
 7 
 8 int main()
 9 {
10     /*
11      0000 0000 0000 0000 0000 0000 0000 0000
12      0000 0000 0000 0000 0000 0000 0000 1111
13      
14      9 : 0000 0000 0000 0000 0000 0000 0000 1001
15      -10 : 1111 1111 1111 1111 1111 1111 1111 0110
16      */
17     
18     
19     //printf("%d\n", ~9);
20     
21     
22     printBinary(-10);
23     return 0;
24 }
25 
26 void printBinary(int number)
27 {
28     
29     // 记录现在挪到第几位
30     // (sizeof(number)*8) - 1 == 31
31     int temp = ( sizeof(number)<<3 ) - 1;
32     
33     while ( temp >= 0 )
34     {
35         // 先挪位,再&1,取出对应位的值
36         int value = (number>>temp) & 1;
37         printf("%d", value);
38         
39         // 
40         temp--;
41         
42         // 每输出4位,就输出一个空格
43         if ( (temp + 1) % 4 == 0 )
44         {
45             printf(" ");
46         }
47     }
48     
49     printf("\n");
50 }

 

    原文作者:登山赏枫
    原文地址: http://www.cnblogs.com/dssf/archive/2015/06/19/4589908.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞