中午好 ,今天是: 2024年11月22日
|
|
|
|
|
|
 
单元练习
第1章 C语言程序设计基本知识
第2章 算法及其描述
第3章 数据类型及表达式
第4章 结构化程序设计
第5章 数组
第6章 函数与预处理
第7章 指针
第8章 结构体、共用体和枚举类型
第9章 位运算
第10章 文件
模拟测试
模拟测试一
模拟测试二
模拟测试三
第9章 位运算
发布人:
陈裕雄
一、选择题
1.以下关于位运算的叙述错误的是(    )。
A、位操作是对字节或字节内部二进制位进行测试、设置、移位或逻辑的运算
B、按位取反运算的运算规则是:0的按位取反结果为1,1的按位取反结果为0
C、对于无符号数而言,左移位相当于乘2运算,左移n位相当于乘2的n次方
D、对于无符号数而言,右移位相当于乘2运算,右移n位相当于乘2的n次方

2.设x=2,y=3,则表达式x<<y的值为(    )。
A、9 B、8 C、16 D、5

3.下列程序运行时,如果输入4和3则输出结果是(    )。
#include <stdio.h>
void main()
{
   int a,b,e;
  puts("请输入a和b的值:");
  scanf("%d",&a);
  scanf("%d",&b);
  e=a<<b;
  printf("%d\n",e);
}
A、-17      B、-256        C、32         D、5

4.下列程序的输出结果是(    )。
#include <stdio.h>
void main()
{
  int x;
  long y;
  long z;
    x=32;
   y=-8;
  z=x&y|y;
    printf("%ld\n",z);
}
A、-17          B、-8           C、16            D、5

5.阅读下列程序,判断在输入“1,2”时,程序输出的c值为(    )。
#include <stdio.h>
void main()
{
  int a;
   long b;
  long c;
  puts("请输入a和b的值:\n");
  scanf("%ld,%ld",&a,&b);
c=(a^b)&(~b);
   printf("The value of c is %ld\n",c);
}
A、-1 B、-2 C、1 D、2

6.下列运算符的优先级最高的是(    )。
A、| B、+ C、~ D、&

7.下列程序输出的p值为(    )。
#include <stdio.h>
void main()
{
  int m=3;
  long n=5;
  long p;
  p=(n<<m)+(m*n) ;
  printf("The value of p is %ld\n",p);
}
A、-40 B、-45 C、40 D、55

8.在移位运算中,对于无符号数,左移n位相当于(    )。
A、该数乘以2的n-1次方
B、该数除以2的n-1次方
C、该数乘以2的n次方
D、该数除以2的n次方

9.仔细阅读下列程序,判断下列程序在输入“1,2”时的输出结果(    )。
#include <stdio.h>
void main()
{
  int x;
  long y;
  long z;
  int a,b ;
  puts("请输入x和y的值:\n"); /*在屏幕上输出一串字符串提示*/
  scanf("%d,%ld",&x,&y);
  x&=y;
  z=x&~y;
  a=sizeof(x);
  b=sizeof(z);
  printf("%ld %d %d\n",z,a,b);
}
A、0 4 4
B、1 2 4
C、7 8 4
D、0 7 8

10.有以下程序:
#include <stdio.h>
void main()
{
  char x=040;
  printf("%d\n",x=x<<1);
}
程序运行后的输出结果是( )。
A、100 B、160 C、120 D、64

11.设有定义语句:
char a=3,b=6,c;
则执行赋值语句c=a^b<<2;后变量c中的二进制值是( )。
A、00011011 B、00010100 C、00011100 D、00011000

12. 有以下程序:
#include <stdio.h>
void main()
{
  short int x=35;
  char z='A';
  printf("%d\n",(x&15)&&(z<'a'));
}
程序运行后的输出结果是( )。
A、0 B、1 C、2 D、3

13.有以下程序:
#include <stdio.h>
void main()
{
  short int a=5,b=6,c=7,d=8,m=2,n=2;
  printf("%d\n",(m=a>b)&(n=c>d));
}
程序运行后的输出结果是( )。
A、0 B、1 C、2 D、3

二、填空题
1.位操作可以分为两类,一类是(          ),一类是(          )。
2.位逻辑运算的四个操作符中(          )操作符的运算对象只有一个。
3.移位运算中的无符号数右移时,左端空出的位补(          )。
4.位运算符可以和赋值运算符构成(          )位运算符。
5.当参加位运算的两个操作数的长度不等时系统自动按(          )。对于无符号数,系统在做对齐处理时,左端一律补(          )。对于有符号数来说,正数在做对齐处理时,左端补(          );负数在做对齐处理时,左端补(          )。
6.位段结构的特殊性是其各个成员只能是(          )型的。
7.设变量a的二进制数是00101101,若想通过运算a^b使a的高四位取反,低四位不变,则b的二进制数应是(          )。
8.a为任意整数,能将变量a清0的表达式是(          )。
9.a为八进制数07101。能将变量a中的各二进制位均置成1的表达式是(          )。
10.能将两字节变量x的高8位全置1,低8位字节保持不变的表达式是(          )。
11.运用位运算,能将八进制数012500除以4,然后赋给变量a的表达式是(          )。
12.运用位运算,能将字符型变量ch中大写字母转换成小写字母的表达式是(          )。

三、程序设计题
1.编写程序实现取一个整数a从右端开始的第4~7位。
2.定义一个位段,使其满足下面的要求:
①a有2位;
②b有2位;
③c有2位;
④d有4位,且另起一个存储单元;
⑤f有7位。
答案:
1、选择题
(1)D (2)C (3)C (4)B (5)C     (6)C (7)D
(8)C (9)A (10)D (11)A (12)B (13)A

2、填空题
(1) 逻辑位运算、移位运算    (2)按位取反。
(3) 0                       (4) 复合赋值位运算符 。
(5) 右对齐、0、0、1         (6)  整型   。
(7) 11110000                (8)  a^=a   。
(9) a=~(a^a)                (10) x=(x|ff00)|(x&00ff) 。
(11) a=012500>>2            (12)ch=ch|32

3、程序设计题
(1) /*
题目:取一个整数a从右端开始的4~7位。
程序分析:可以这样考虑:
(1)先使a右移4位。
(2)设置一个低4位全为1, 其余全为0的数。可用~(~0<<4)
(3)将上面二者进行&.运算。

*/
#include <stdio.h>
void main()
{
unsigned a,b,c,d;
scanf("%o",&a);
b=a>>4;
c=~(~0<<4);
d=b&c;
printf("%o\n%o\n",a,d);
}
(2)  #include <stdio.h>
void main()
{
struct bit
{
unsigned a:3;
unsigned b:2;
unsigned c:2;
/*unsigned类型的数据在VC6.0中为4个字节*/
unsigned x:32-(3+2+2);/*定义25位不使用的位段*/
unsigned d:4; /*d另起一个存储单元*/
unsigned f:7;
}s={1,2,3,0,4,5};          /*初始化*/
printf("%d %d %d %d %d %d\n",s.a,s.b,s.c,s.x,s.d,s.f);
}
 

Copyright©2012,All Rights Reserved
版权所有:广东南方职业学院计算机系 设计:陈裕雄