现在的位置: 首页 > 综合 > 正文

位运算符和位运算

2014年01月25日 ⁄ 综合 ⁄ 共 2114字 ⁄ 字号 评论关闭

原文地址:http://hi.baidu.com/jnshiyanlvting/blog/item/7aec317cc1c3992a0dd7da3c.html

 

位运算符和位运算                                                  

    

位运算:以二进制位为单位的运算。位运算仅限于整数(整型数和字符型)

一、


运算符 (&)

   1. 运算规则  

运算的两个二进制位值都为 1,结果才为1

   2. 举例

    3&5=1

    18&35=?

    23&1=?

二、或
运算符 ( | )

   1. 运算规则

  运算的两个二进制位值有一个为 1,结果就为1

   2. 举例

    3|5=?

    18|35=?

    两个数组或运算的意义延伸

三、异或
运算符 (^)

   1. 运算规则

  运算的两个二进制位值不同,结果为 1,否则结果为0

   2. 举例

    A=3

    A=A^5=? A=A^5=?  两个数组异或运算的意义延伸

四、取反
运算符 (~)

   1. 运算规则

    若运算的位值为 1,结果为0,值为0,则结果为1。

   2. 举例

    ~3=?    取反位运算符的运算优先级高于其它位运算符取反在图形学上的含义

五、左移
运算符 (<<)

   1. 运算规则

    整体左移,右补 0,左移出的高位丢弃

    左移 1位,相当于乘2(高位未移出时)

    左移 n位,相当于乘2的n方(高位未移出时)

   2. 举例

    1<<1; 1<<2

    1<<15

六、右移
运算符 (>>)

   1. 运算规则  

整体右移,左补 0/1,右移出的低位丢弃右移 1位,相当于除2(低位未移出时)右移 n位,相当于除2的

n方(低位未移出时)

   2. 举例

    12>>1 12>>2

    65>>5

七、赋值
运算符

   1. 运算符

    &=, |=, ^=, >>=, <<=

   2. 举例

    a&=3

八、
运算举例

 

[ 例 ] 输入一个正整数,然后输出它对应的二进制数。

 

/* 方法一 */


main()

{

int x, t, i;

clrscr();

printf("please input x:");

scanf("%d", &x);

for (i=0; i<16; i++ )

{

t=x%2;

gotoxy(16-i,3);

printf("%d",t);

x=x/2;

}

getch();

}

 

/* 方法二 */


#include "conio.h"

main()

{

int x, i, t;

clrscr();

printf("please input x:");

scanf("%d", &x);

for (i=0; i<16; i++)

{

t=x>>i; // 除 2

t=t&1; // 取余

gotoxy(16-i,4);

printf("%d",t);

/* t=x>>(15-i);

t=t&1;

printf("%d",t);*/

}

getch();

}

 

/* 方法三 */


#include "conio.h"

#include "math.h"

main()

{

int x, i, t, n;

clrscr();

printf("please input x:");

scanf("%d", &x);

for (i=0; i<16; i++)

{

n=pow(2,i);

t=x&n;

t=t>>i;

gotoxy(16-i,4);

printf("%d",t);

/* n=pow(2,15-I);

t=x&n;

t=t>>(15-I);

printf(“%d”,t);*/

}

getch();

}

§ 12.6 位段

   位段:在一个结构体中可以以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段(或位域)。

一、位段的定义

  如:
struct packed_data

    {

    unsigned a : 2;

    unsigned b : 3;

    unsigned c : 4;

    int i;

 



    } data ;


二、位段的引用

   1. 引用形式

    data.a=2;

    data.b=7;

    data.c=9;

    位段允许的最大值范围, data.a=4 是错的

   2. 说明

    ⑴ 位段成员的类型必须指定为 unsigned int 类型。

    ⑵ 允许在位段中定义无名字段,其含义为跳过该字节剩余的位或指定的位不用。当无名字长度为 0 时,跳过该字节剩余

的位不用;当无名字段长度为 n 时,跳过 n 位不用。

    ⑶ 位段的长度不能大于存储单元的长度。即≤ 16 位

    ⑷ 不能定义位段数组。

    ⑸ 位段可以在数值表达式中引用,也可以用整型格式输出。

    如: struct packed_data

      { unsigned a : 2;

       unsigned b : 3;

       unsigned : 0;

       unsigned c : 4;

       int i;

      } data ;

 

a

b

a

c

a

i

2

3

3

4

4

8

  又如: struct packed_data

     { unsigned a : 2;

      unsigned b : 3

      unsigned : 2;

      unsigned c : 4;

      int i;

     } data ;

 

a

b

a

c

a

i

2

3

2

4

5

8

抱歉!评论已关闭.