位运算练习作业

简介

进一步理解书中第二章《信息的表示和处理》部分的内容,深刻理解整数、浮点数的表示
和运算方法,掌握GNU GCC工具集的基本使用方法。

要求

请按照要求补全 bits.c 中的函数,并进行验证。包括以下6个函数 :

1. int isAsciiDigit(int x)

功能:当0x30<=x<=0x39时(即字符0-9的ASCII码值)返回1;其他情况下返回0
示例:isAsciiDigit(0x35) = 1
isAsciiDigit(0x3a) = 0
isAsciiDigit(0x05) = 0
难度:3
可使用运算符数:15

int isAsciiDigit(int x) {
  int up_num = x + (~58 + 1);  //最高位为1
  int low_num = x + (~48 + 1);   //最高位是0
  
  int Is_up_legal = (!((up_num >> 31) + 1));
  int Is_down_legal = ((low_num >> 31) + 1);
  
  return   (Is_up_legal & Is_down_legal);
}
  In this function, what we should to do is to judge weather the 'x' is bigger than 48(inclusive) and smaller than 57(inclusive). 
  first:
  we mapping the legal-x:
  up_num = x -58;     
  low_num = x - 48;
  we will get (up_num < 0) and (low_num >= 0) if the "x" is legal.
  then:
  "(( up_num >> 31) + 1)" will be equal to 0 ,if (up_num < 0).
  "((low_num >> 31) + 1)" will be equal to 1 ,if (low_num >= 0).
  so,if (up_num < 0), "Is_up_legal" will be equal to 1.if (low_num >= 0),"Is_down_legal" will be equal to 1.
  last:
  only if ((up_num >> 31) + 1) == 0 and ((low_num >> 31) + 1), we return 1;

2. int anyEvenBit(int x)

功能:当x的任意偶数位为1时,返回1;其他情况下返回0
示例:anyEvenBit(0xA) = 0
anyEvenBit(0xE) = 1
难度:2
可使用运算符数:12

int anyEvenBit(int x) {
  int x1 = x >> 8;
  int x2 = x1 >> 8;
  int x3 = x2 >> 8;
  return !!( ( x | x1 | x2 | x3 )& 0x55);
}
  /*
  每次我们移动8位,把移动的3次结果和x一起做|运算,相当于把每8个信息都重叠到最低的8位,
  此时与01010101做&运算就可以知道其偶数位是否是1.
  */

3. int copyLSB(int x)

功能:将返回值中的所有位全部置位成x中的第0位的值
示例:copyLSB(5) = 0xFFFFFFFF, copyLSB(6) = 0x00000000
难度:2
可使用运算符数:5

int copyLSB(int x) {
  int temp = x & 1;
  return (~temp + 1);
}

  /*
  first, we could get least significant bit by used "x & 1".
  then, we could get result 
  */

4. int leastBitPos(int x)

功能:返回一个掩码,在该掩码中标识了二进制数x的所有位中,“1”所在的位权最小的位
示例:leastBitPos(0x60) = 0x20
难度:2
可使用运算符数:6

int leastBitPos(int x) {

  return (~x+1) & x;
}
  /*
  we get the "-x",than "(-x)&x" is what we need.
  */

5. int divpwr2(int x, int n)

功能:计算 x / 2^n,并将结果取整
示例:divpwr2(15,1) = 7
divpwr2(-33,4) = -2
难度:2
可使用运算符数:15

int divpwr2(int x, int n) {
  int op = (x >> 31) + 1;
  int temp  =   x  >> n;
  int temp2 = temp << n;
  int Is_exact_division = !!(temp2 ^ x);
  return (temp + (    (!op) & (!!n) & (Is_exact_division)  )   );
}
  /*
  一般来说,“>>”符号代表 x/(2^n),并向下取整(无论正负)。
  所以有三种情况需要考虑:
    如果负数,需要向上取整。
    如果 n=0 应该为 x。
    如果能够整除,就不需要取整操作。

  此题中,op是符号标志位,正数为1,负数为0.
  temp为x右移动n位结果,相当直接 x/(2^n) ,向下取整。
  temp2为temp左移动n位结果,利用(temp2 ^ x),可以判断temp舍弃的几位是否都是0(既能否整除)。
  Is_exact_division 代表如果能整除为0,反之为1。
  因为>>默认代表向下取整,所以我们需要考虑上述情况,利用 (!op) & (!!n) & (Is_exact_division)实现,
  其含义:同时满足 (负数)(n!=0)(不能整除) 三种情况返回1,否则返回0。
  也意味着,满足上述三情况才需要在向下取整的前提+1,否则向下取整结果就是正常取整结果。
  */

6. int bitCount(int x)

功能:计算二进制数x中,对应位值“1”的总位数
示例:bitCount(5) = 2
bitCount(7) = 3
难度:4
可使用运算符数:40

int bitCount(int x) {

  int mask = (0x11 <<24) | (0x11 << 16) | (0x11 << 8) |(0x11) ;

  int temp = x & mask;
  x = x >> 1;
  temp = temp + (x & mask); 
  x = x >> 1;
  temp = temp + (x & mask); 
  x = x >> 1;
  temp = temp + (x & mask); 
  
  return ((temp & 0xf) + 
          ( (temp >> 4) & 0xf )+ 
          ( (temp >> 8) & 0xf )+
          ( (temp >> 12) & 0xf )+
          ( (temp >> 16) & 0xf )+
          ( (temp >> 20) & 0xf )+
          ( (temp >> 24) & 0xf )+
          ( (temp >> 28) & 0xf ));

}
 /*首先分割成4块,每块右移动,同时比较每个块的1的个数*/

tip:程序内允许使用:

a. 运算符: ! ~ & ^ | + << >>
b. 范围在0 - 255之间的常数
c. 局部变量

tip:程序内禁止以下行为:

a. 声明和使用全局变量
b. 声明和使用定义宏
c. 声明和调用其他的函数
d. 类型的强制转换
e. 使用许可范围之外的运算符
f . 使用控制跳转语句:if else switch do while for
注意:违背以上原则均视为程序不正确!!

  • 23
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
10秋计算机作业题 一、填空题: 1. 计算机是应用电子技术进行数据处理的机器,其主要工作是进行( )。 2.在全角状态下输入一个英文字母,该字母在屏幕上占( )个ASCII码字符位。 3.( )是计算机表示数据的基本单位。 4.两位二进制可表示( )种不同的状态。 5.在Word窗口的"窗口"菜单的下面有一些文件名,它们是( )Word文档名。 6.在Excel中,若在工作表中选取一组单元格,则其中活动单元格的数目有( )个。 7.在PowerPoint中,只有在( )或幻灯片浏览视图中才能复制幻灯片。 8.( )是全球最大的、开放的、由众多网络互连而成的计算机网络。 9.63.在Windows2000系统中,被删除的文件或文件夹将存放在 ( )中。 10.数据库可以直观地理解为( )的仓库. 1170.计算机病毒是指"编制或在计算机程序中插入的破坏计算机功能或毁坏数据、影响 计算机使用、并能自我复制"的一组计算机指令或者( )。 1272. 在计算机网络中,使用域名方式访问Internet上的某台计算机,需要通过( )转换成IP地址才能被Internet识别。 13.无论是西文字符还是中文字符,在机一律用( )编码来表示。 14.60.在计算机系统中扩展名为.EXE的文件是 ( )文件。 15.65.在Word中,利用公式对表格中的数据进行运算,公式中的"B4"表示的是 ( )的表格单元。 16.触摸屏和扫描仪都属于多媒体( )设备。 17.通常清除病毒的方法有人工清除病毒和( )两种方式。 18.信息安全研究的问题包括信息本身的安全和( )的安全。 19.公共FTP服务器支持( )两种方式的账号访问。 20.在局域网体系结构中,数据链路层分为( )和逻辑链路控制两个子层。 21.微型计算机硬件系统由微处理器、输入设备、输出设备和(     )组成。 22. 打印机与主机的通讯方式通常为(   )数据传输方式。 23.地址总线是单向总线,指明数据总线上的数据的(     ). 24.18.在Word文档中,打开一个已有的文档并进行编辑后,如果想把文档存放在另一个 文件夹中,或是选用其它的文件名,应该执行"文件"菜单中的(    )命令。 25.23.通过Excel建立的磁盘文件称为(    ),它是Excel应用程序工作区中的一 个或多个工作表的集合。 26.PowerPoint的主要工作是创意和(     )。 27.202.112.144.75是Internet上一台计算机的(    )地址。 28.信息技术最主要的负面影响是信息环境污染,主要由(         )、 有害信息、虚假信息等构成。 29.在Intranet常采用(    )技术以保护企业部的信息安全。 30.一个字节是由 (   )个二进制位组成。 3173. Internet的通信协议是(     )。 32.数据库可以直观地理解为(    )的仓库. 33.66.在Excel中,如果用数格式显示数据而超过单元格基本长度,在单元格中 会出现(      )。 34.如果想不启动PowerPoint就能放映幻灯片,只需打开该演示文稿,然后另存为扩 展名为(    )的文件即可。 35.算术逻辑单元也称(    ),主要用于完成计算机的数据处理功能。 36.在PowerPoint中,对于较大的演示文稿,为了能在另一台计算机上放映,需要进 行(    )操作。 37. 计算机具有运算速度快、(    )、记忆和逻辑判断能力和计算机部操作的自动化 等特点。 38. 计算机发生死机,若不能接收键盘信息,最好采用(        )方法重新启 动计算机。 39.计算机存储单元的编号称为(    )。 40. 24.在Excel中,输入数,该数出现在活动单元格和工作表上方的(       )中。 41. 基于.诺依曼思想设计的计算机,主要特点是( )等。 42. 计算机病毒通常用( )语言编写。 43. 与十进制数"219"等的二进制数是( ). 44. Word提供了四种文档显示视图,可以显示正文及其图形的视图是( )。 16.45.在Word文档中,段落标记是在按( )之后产生的。 46.在Excel中,工作表标签位于工作簿窗口底部,每个工作表对应( )个工作表标签。 47.在PowerPoint中,演示文稿中的所有幻灯片的大小、高度是( )的。 48.在计算机网络中,服务器提供的共享资源主要是指硬件、软件和( )。 49.E-mail地址由两部分组成,之前表示的是( )。 50.一个IP地址可对应( )个域名。 51.利用( )可以实现不同类型的计算机和不同操作系统之间的文件传输。 52.数据压缩主要应用于两个方面:一是传输,二是( )。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值