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 }
  • 相关阅读:
    Linux搭建ElasticSearch环境
    从DDD开始说起
    TFS看板晨会
    TFS看板的迭代规划
    TFS看板规则
    TFS看板的设计
    Api容器在应用架构演化中的用途
    基于Abp的WebApi容器
    线程队列
    动态类型序列化
  • 原文地址:https://www.cnblogs.com/dssf/p/4589908.html
Copyright © 2011-2022 走看看