zoukankan      html  css  js  c++  java
  • c语言位运算符

    C语言既具有高级语言的特点,又具有低级语言的功能。

             所谓位运算是指进行二进制位的运算。

             C语言提供的位运算:

    运算符   含义  
    &   按位与  
    |   按位或  
    ∧   按位异或  
    ∽   取反  
    <<   左移  
    >>   右移  

    说明:

    1。位运算符中除∽以外,均为二目(元)运算符,即要求两侧各有一个运算了量。

    2、运算量只能是整形或字符型的数据,不能为实型数据。

       “按位与”运算符(&)    

           规定如下:

    0&0=0   0&1=0   1&0=0   1&1=1  

             例:3&5=?
                             先把3和5以补码表示,再进行按位与运算。

    3的补码:   00000011  
    5的补码:   00000101  

      
    &:   00000001  

                             3&5=1

    --------------------------------------------------------------------------------

       “按位或”运算符(|)    

             规定如下:

    0|0=0   0|1=1   1|0=1   1|1=1  

             例:060|017=?
                             将八进制数60与八进制数17进行按位或运算。                        

    060   00110000  
    017   00001111  

      
    |:   00111111  

                             060|017=077

    --------------------------------------------------------------------------------

       “异或”运算符(∧),也称XOR运算符    

             规定如下:

    0∧0=0   0∧1=1   1∧0=1   1∧1=0  

             例:57∧42=?
                             将十进制数57与十进制数42进行按位异或运算。                        

    57   00111001  
    42   00101010  

      
    ∧:   00010011  

                             57∧42=19

    --------------------------------------------------------------------------------

       “取反”运算符(∽)    

             规定如下:

    ∽0=1   ∽1=0  

             例:∽025=?
                             对八进制数25(即二进制0000000000010101)按位求反。

    0000000000010101  
    ↓  
    1111111111101010  

                             ∽025=177752

    --------------------------------------------------------------------------------

       左移运算符(<<)    

     

           将一个数的二进位全部左移若干位,若高位左移后溢出,则舍弃,不起作用。

             例:a=a<<2
                             将a的二进制数左移2位,右补0。
                             若a=15,即二进制数00001111,则

    a   00001111  
    ↓   ↓  
    a<<1   00011110  
    ↓   ↓  
    a<<2   00111100  

                             最后a=60

    --------------------------------------------------------------------------------

       右移运算符(>>)    

     

           将一个数的二进位全部右移若干位,低位移出部分舍弃。

             例:a=a>>2
                             将a的二进制数右移2位,左补0。
                             若a=15,即二进制数00001111,则

    a   00001111  
    ↓   ↓  
    a>>1   00000111  
    ↓   ↓  
    a>>2   00000011  

                             最后a=3

    --------------------------------------------------------------------------------

    位运算符与赋值运算符结合可以组成扩展的赋值运算符

             如:&=,|=,>>=,<<=,∧=

             例:a&=b相当于a=a&b

                         a<<=2相当于a=a<<2

    不同长度的数据进行位运算

             如果两个数据长度不同(例如long型和int型)进行位运算时(如a&b,而a为long型,b为int型),系统会将二者按右端对齐。如果b为正数,则左侧16位补满0。若b为负,左端应补满1。如果b为无符号整数型,则左端添满0。

    位运算举例
             例:取一个整数a从右端开始的4∽7位

                     考虑如下:1、先是a右移4位,即a>>4

                                         2、设置一个低4位全为0的数,即∽(∽0<<4)    

                                         3、将上面两式进行与运算,即a>>4&∽(∽0<<4)    

                     程序如下:

                                             main()

                                             {unsigned   a,b,c,d;

                                               scanf("%o",&a);

                                               b=a>>4;

                                               c=∽(∽0<<4);

                                               d=b&c;

                                               printf("%o %o ",a,b);

                                             }

                     结果:331↙

                         331(a的值,八进制)

                         15   (d的值,八进制)

    例:循环移位。要求将a进行右循环移位。即a右循环移n位,将a中原来左面(16-n)位右移n位。现假设两个字节存放一个整数。如右图。    

                     考虑如下:1、先将a右端n位放到b中的高n位中,即:b=a<<(16-n)

                                         2、将a右移n位,其左面高位n位补0,即c=a>>n

                                         3、将c与b进行按位或运算,即c=c|b  

                     程序如下:

                                             main()

                                             {unsigned   a,b,c;int   n:

                                               scanf("a=%o,n=%d",&a,&n);

                                               b=a<<(16-n);

                                               c=a>>n;

                                               c=c|b;

                                               printf("%o %o",a,c);

                                             }

                     结果:a=157653,n=3↙

                         331(a的值,八进制)

                         15   (d的值,八进制)

    位段
    所谓位段是以位为单位定义长度的结构体类型中的成员。

             例:struct   packed-data

                                     {unsigned   a:2;

                                       unsigned   b:6;

                                       unsigned   c:4;

                                       unsigned   d:4;

                                       int             i;

                                     }data;

  • 相关阅读:
    多表联合查询,利用 concat 模糊搜索
    order by 中利用 case when 排序
    Quartz.NET 3.0.7 + MySql 动态调度作业+动态切换版本+多作业引用同一程序集不同版本+持久化+集群(一)
    ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
    ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
    ASP.NET Core 2.2 基础知识(十六) SignalR 概述
    ASP.NET Core 2.2 基础知识(十五) Swagger
    ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
    linux磁盘管理 磁盘查看操作
    linux磁盘管理 文件挂载
  • 原文地址:https://www.cnblogs.com/mvv118/p/4102890.html
Copyright © 2011-2022 走看看