zoukankan      html  css  js  c++  java
  • 【学习笔记】【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
    ", 9^9);
    60     
    61     //printf("%d
    ", 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
    ", ~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
    ", 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
    ", 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
    ", 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("奇数
    ");
    22     } else {
    23         printf("偶数
    ");
    24     }*/
    25     
    26     //a%2==0?printf("偶数
    "):printf("奇数
    ");
    27     
    28     //a%2?printf("奇数
    "):printf("偶数
    ");
    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
    ", ~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("
    ");
    50 }
  • 相关阅读:
    牛客IOI周赛17-提高组 卷积 生成函数 多项式求逆 数列通项公式
    6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
    AtCoder Grand Contest 044 A Pay to Win 贪心
    5.29 省选模拟赛 树的染色 dp 最优性优化
    luogu P6097 子集卷积 FST FWT
    CF724C Ray Tracing 扩展欧几里得 平面展开
    5.30 省选模拟赛 方格操作 扫描线 特殊性质
    5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集
    Spring main方法中怎么调用Dao层和Service层的方法
    Bug -- WebService报错(两个类具有相同的 XML 类型名称 "{http://webService.com/}getPriceResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。)
  • 原文地址:https://www.cnblogs.com/dssf/p/4589908.html
Copyright © 2011-2022 走看看