位运算 样例

来源:互联网 发布:贵州广电网络微博 编辑:程序博客网 时间:2024/06/09 15:12

12.2 位运算举例

  取一个整数 a 从右端开始的 4~7 位

  (1)先使 a 右移 4 位

  a >> 4;

  (2)设置一个低 4 位全为 1 ,其余全为 0 的数,可以用下面方法实现:

  ~(~0<<4)

~0 的全部二进制为 1 ,左移 4 位,这样右端低 4 位为 0。

  (3)将上面二者进行 & 运算。

  a >> 4 & ~(~0<<4)

include <stdio.h>void main(){  unsigned a, b, c, d;  scanf("%o", &a);  b = a >> 4;  c = ~(~0<<4);  d = b & c;}

循环移位

include <stdio.h>void main(){  unsigned a, b, c;  int n;  scanf("a=%o, n=%d", &a, &b);  b = a << (16 - n);  c = a >> n;  c = c | b;  printf("%o\n%o", a, c);}

12.3 位段

  以前曾介绍过对内存中信息的存取,存取一般以字节为单位,实际上,有时存储一个信息不必用一个或多个字节,例如,真 或 假 用 0 或 1 ,只需 1 位即可,在计算机用于过程控制,参数检测或是数据通信领域时,控制信息往往只占一个字节中的一个或几个二进位,常常在一直字节中放几个信息。

  向一个字节中的一个或几个二进拉赋值和改变它的值可以用以下两种方法:

  (1)可以人为的地在两个字节 data 中设几个项。例如 a, b, c, d分别占 2 位,6 位,4位,4位。如果想将 c 的值改变为 12 (设原来为0)

  a. 将数12 左移 4 位,使1100 成为右面起第 4 ~ 7位。

  b. 将 data 与 12 << 4 进行按拉或,即可以使 c 的值变成 12。

  (2)位段

  C 语言允许在一个结构体中以位为单元来指定其成员所占内存长度,这种以位为单元的成员称为 位段 或称 位域,利用位段能够用较少的位数存储数据。例如:

  struct packed_data

  {

    unsigned a : 2;

    unsigned b : 6;

    unsigned c : 4;

    undigned d : 4;

    int i;

  }data;

其中 a, b, c, d 分别占2 位,6位,4位,4位,i 为整型。

也可以使各个位段不恰好占满一个字节。如:

struct packed_data

{

  unsigned a : 2;

  unsigned b : 3;

  unsigned c : 4;

  int i;
};

struct packed_data data;

其中 a, b, c 共占 9 位,占 1 个字节多,不到 2 个字节,它后面为 int 型。在 a, b, c 之后的 7 位空间闲置不用,i 从别一个字节开头起存放。

  注意,在存储单元中位段的空间分配方向,因机器而异,在微机使用的 C系统中,一般是由右到左进行分配的,但用户可以不必过问这种细节。

  对位段中的数据引用的方法。如:

  data.a = 2;

  data.b = 7;

  data.c = 9;

注意位段允许的最大值范围如果写

  data.a = 8;

就错了,因为 data.a 只占两个位,最大值为 3。在些情况下,自动取赋的数的低位。例如 8 的二进制形式为 1000 ,而 data.a 只有 2 位,取 1000 的低 2 位,故 data.a 得值 0。

  关于位段的定义和引用说明:

  (1)位段成员的类型必须指定为 unsigned int 类型。

  (2)若某一位段要从另一个字开始存放。可以用以下形式定义

  unsigned a : 1;

  unsigned b : 2;

  unsigned : 0;

  unsigned c : 3;

本来 a, b, c 应连续存放在一个存储单元中,由于中了长度为 0 的位段,其作用是使下一个位段从下一下个存储单元开始存放,因此,现在只将 a, b 存储在一个存储中,c 另存放在下一个单元。

  (3)一个位段必须存储在同一个存储单元中,不能跨两个单元,如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。

  (4)可以定义无名字段。如:

unsigned a :1;

unsigned : 2;

unsigned b : 3;// 这两位空间不用

unsigned c : 4;

  (5)位段的长度不能大于存储单元的长度,也不能定义位段数组。

  (6)位段可以用整型格式输出。如:

  printf(“%d, %d, %d”, data.a, data.b, data.c);

当然也可以用 %u, %o, %x, 等格式输出。

  (7)位段可以在数据表达式中引用,它会被系统自动转换成整型数。如:

  data.a + 5 / data.b

是合法的。

原创粉丝点击