首先声明datalab本人未完成,有4道题目没有做出来。本文博客记录下自己的解析,以便以后回忆。如果能帮助到你就更好了,如果觉得本文没啥技术含量,也望多多包涵。

  1. /*
  2. * bitAnd - x&y using only ~ and |
  3. * Example: bitAnd(6, 5) = 4
  4. * Legal ops: ~ |
  5. * Max ops: 8
  6. * Rating: 1
  7. */
  8. int bitAnd(int x, int y) {
  9. return ~(~x | ~y);
  10. }
  11. /*
  12. * getByte - Extract byte n from word x
  13. * Bytes numbered from 0 (LSB) to 3 (MSB)
  14. * Examples: getByte(0x12345678,1) = 0x56
  15. * Legal ops: ! ~ & ^ | + << >>
  16. * Max ops: 6
  17. * Rating: 2
  18. */
  19. int getByte(int x, int n) {
  20. int offsetValue = 0xff;
  21. int offsetIndex = n << 3;
  22. int value = (x & (offsetValue << offsetIndex)) >> offsetIndex;
  23. return value & offsetValue;
  24. }
  25. /*
  26. * logicalShift - shift x to the right by n, using a logical shift
  27. * Can assume that 0 <= n <= 31
  28. * Examples: logicalShift(0x87654321,4) = 0x08765432
  29. * Legal ops: ! ~ & ^ | + << >>
  30. * Max ops: 20
  31. * Rating: 3
  32. */
  33. int logicalShift(int x, int n) {
  34. int offset = 0x1 << 31;
  35. int offsetValue = ~(offset >> n << 1);
  36. return (x >> n) & offsetValue;
  37. }
  38. /*
  39. * bitCount - returns count of number of 1's in word
  40. * Examples: bitCount(5) = 2, bitCount(7) = 3
  41. * Legal ops: ! ~ & ^ | + << >>
  42. * Max ops: 40
  43. * Rating: 4
  44. */
  45. int bitCount(int x) {
  46. return 2;
  47. }
  48. /*
  49. * bang - Compute !x without using !
  50. * Examples: bang(3) = 0, bang(0) = 1
  51. * Legal ops: ~ & ^ | + << >>
  52. * Max ops: 12
  53. * Rating: 4
  54. */
  55. int bang(int x) {
  56. return 2;
  57. }
  58. /*
  59. * tmin - return minimum two's complement integer
  60. * Legal ops: ! ~ & ^ | + << >>
  61. * Max ops: 4
  62. * Rating: 1
  63. */
  64. int tmin(void) {
  65. return (0x1 << 31);
  66. }
  67. /*
  68. * fitsBits - return 1 if x can be represented as an
  69. * n-bit, two's complement integer.
  70. * 1 <= n <= 32
  71. * Examples: fitsBits(5,3) = 0, fitsBits(-4,3) = 1
  72. * Legal ops: ! ~ & ^ | + << >>
  73. * Max ops: 15
  74. * Rating: 2
  75. */
  76. int fitsBits(int x, int n) {
  77. int offsetValue = 0x1 << n;
  78. int addValue = (offsetValue >> 1) & (~offsetValue);//2^(n-1)
  79. int value1 = x + addValue;//x - {-[2^(n-1)]}
  80. int value2 = addValue + (~x);//[2^(n-1)-1] - x
  81. int maxValue = 0x1 << 31;
  82. return (n >> 5) | ((!(value1 & maxValue)) & (!(value2 & maxValue)));
  83. }
  84. /*
  85. * divpwr2 - Compute x/(2^n), for 0 <= n <= 30
  86. * Round toward zero
  87. * Examples: divpwr2(15,1) = 7, divpwr2(-33,4) = -2
  88. * Legal ops: ! ~ & ^ | + << >>
  89. * Max ops: 15
  90. * Rating: 2
  91. */
  92. int divpwr2(int x, int n) {
  93. int maxValue = 0x1 << 31;
  94. int offsetValue = ~(0x1 << 31 >> (32 + ~n));
  95. int andValue = offsetValue & x;
  96. return (x >> n) + ((!!(x & maxValue)) & (!!(andValue)));
  97. }
  98. /*
  99. * negate - return -x
  100. * Example: negate(1) = -1.
  101. * Legal ops: ! ~ & ^ | + << >>
  102. * Max ops: 5
  103. * Rating: 2
  104. */
  105. int negate(int x) {
  106. return ~x + 1;
  107. }
  108. /*
  109. * isPositive - return 1 if x > 0, return 0 otherwise
  110. * Example: isPositive(-1) = 0.
  111. * Legal ops: ! ~ & ^ | + << >>
  112. * Max ops: 8
  113. * Rating: 3
  114. */
  115. int isPositive(int x) {
  116. return (!(x >> 31)) ^ (!x);
  117. }
  118. /*
  119. * isLessOrEqual - if x <= y then return 1, else return 0
  120. * Example: isLessOrEqual(4,5) = 1.
  121. * Legal ops: ! ~ & ^ | + << >>
  122. * Max ops: 24
  123. * Rating: 3
  124. */
  125. int isLessOrEqual(int x, int y) {
  126. int offsetValue = 0x1;
  127. int offsetIndex = 31;
  128. int offsetSign = offsetValue << offsetIndex;
  129. int signX = !(x & offsetSign);
  130. int signY = !(y & offsetSign);
  131. int value1 = ((!signX) & signY )^ 0x0;
  132. int value2 = (signX & (!signY)) ^ 0x1;
  133. int value3 = (!((y + ~x + 1) & offsetSign)) ^ 0x0;
  134. return value1 | (value2 & value3);
  135. }
  136. /*
  137. * ilog2 - return floor(log base 2 of x), where x > 0
  138. * Example: ilog2(16) = 4
  139. * Legal ops: ! ~ & ^ | + << >>
  140. * Max ops: 90
  141. * Rating: 4
  142. */
  143. int ilog2(int x) {
  144. return 2;
  145. }
  146. /*
  147. * float_neg - Return bit-level equivalent of expression -f for
  148. * floating point argument f.
  149. * Both the argument and result are passed as unsigned int's, but
  150. * they are to be interpreted as the bit-level representations of
  151. * single-precision floating point values.
  152. * When argument is NaN, return argument.
  153. * Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
  154. * Max ops: 10
  155. * Rating: 2
  156. */
  157. unsigned float_neg(unsigned uf) {
  158. int offsetValue = 0x1;
  159. int offsetIndex = 0;
  160. int andValue = 0;
  161. int signValue;
  162. while (offsetIndex < 31)
  163. {
  164. signValue = (uf & offsetValue) >> offsetIndex;
  165. if (offsetIndex < 23)
  166. {
  167. andValue = andValue | signValue;
  168. }
  169. else
  170. {
  171. andValue = andValue & signValue;
  172. }
  173. offsetIndex += 1;
  174. offsetValue <<= 1;
  175. }
  176. if (andValue)
  177. {
  178. return uf;//NaN
  179. }
  180. return uf ^ offsetValue;
  181. }
  182. /*
  183. * float_i2f - Return bit-level equivalent of expression (float) x
  184. * Result is returned as unsigned int, but
  185. * it is to be interpreted as the bit-level representation of a
  186. * single-precision floating point values.
  187. * Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
  188. * Max ops: 30
  189. * Rating: 4
  190. */
  191. unsigned float_i2f(int x) {
  192. return 2;
  193. }
  194. /*
  195. * float_twice - Return bit-level equivalent of expression 2*f for
  196. * floating point argument f.
  197. * Both the argument and result are passed as unsigned int's, but
  198. * they are to be interpreted as the bit-level representation of
  199. * single-precision floating point values.
  200. * When argument is NaN, return argument
  201. * Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
  202. * Max ops: 30
  203. * Rating: 4
  204. */
  205. unsigned float_twice(unsigned uf) {
  206. int signIndex = 31;
  207. int expIndex = 23;
  208. int offsetValue = 0x1;
  209. int offsetSign = offsetValue << signIndex;
  210. int andValue = 1;
  211. int orValue = 0;
  212. int signValue;
  213. int offsetIndex = expIndex;
  214. while (offsetIndex < signIndex)
  215. {
  216. signValue = (uf & (offsetValue << offsetIndex)) >> offsetIndex;
  217. andValue = andValue & signValue;
  218. orValue = orValue | signValue;
  219. offsetIndex += 1;
  220. }
  221. if (andValue == 1)//exp==255
  222. {
  223. return uf;
  224. }
  225. else if (orValue == 0)//非规格化
  226. {
  227. signValue = !!(uf & offsetSign);
  228. uf <<= 1;
  229. if (signValue == 0)
  230. {
  231. return uf & (~offsetSign);
  232. }
  233. return uf | offsetSign;
  234. }
  235. else
  236. {
  237. signValue = ((uf >> expIndex) + 1) << expIndex;
  238. offsetIndex = expIndex;
  239. while (offsetIndex < signIndex)
  240. {
  241. uf &= ~(offsetValue << offsetIndex);
  242. offsetIndex += 1;
  243. }
  244. return uf | signValue;
  245. }
  246. }

datalab (原发布 csdn 2018年09月21日 20:42:54)的更多相关文章

  1. c# Equal函数 and 运算符'==' (原发布 csdn 2017年10月15日 20:39:26)

    1.==.!=.<.>.<= 和>= 运算符为比较运算符(comparison operator).C#语言规范5.0中文版中比较运算符的描述如下: 2.通用类型系统 3.值类 ...

  2. 关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)

    前言 昨天晚上闲着无事,就上csdn逛了一下,突然发现一个帖子很有意思,就点进去看了一下. 问题很精辟 int a = 1; object b=a; object c = b; c = 2; 为什么b ...

  3. getDate() 获取时间 如2018年09月21日 11:32:11

    function p(s) { return s < 10 ? '0' + s: s;} function getDate() { var myDate = new Date(); //获取当前 ...

  4. 2018年1月21日--2月4日 NAS

    二十号去比赛时,与同事闲聊时说起家庭服务器,后来搜到nas(网络附着存储器),找到freenas,突然觉得很有用,手机拍了大量的照片视频,存储在电脑,已经换过几次硬盘了,对于这些珍贵的资料,万一硬盘坏 ...

  5. java自动化测试开发环境搭建(更新至2018年10月8日 11:42:15)

    1.安装JDK的1.8版本 官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151 ...

  6. 2014年12月23日00:42:54——PS4

    http://tieba.baidu.com/p/3415598015?see_lz=1&pn=1 http://tieba.baidu.com/p/3188981817 http://tie ...

  7. 【12月21日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2018年12月21日 之间,滚动市盈率历史新低排名.上市三年以上的公司,2018年12月21日市盈率在300以下的公司. 1 - 厦门象屿(SH600057) - 历史新 ...

  8. RxJava2.0学习笔记2 2018年7月3日 周二

    摘记: 1.map -- 转换  有些服务端的接口设计,会在返回的数据外层包裹一些额外信息,这些信息对于调试很有用,但本地显示是用不到的.使用 map() 可以把外层的格式剥掉,只留下本地会用到的核心 ...

  9. 导航狗IT周报-2018年05月27日

    原文链接:https://www.daohanggou.cn/2018/05/27/it-weekly-9/ 摘要: “灰袍技能圈子”将闭圈:物理安全:为什么我们现在的生活节奏越来越快? 技术干货 1 ...

随机推荐

  1. python基础(4):用户交互、if判断、while循环、break和continue

    1. 用户交互 使⽤input()函数,可以让我们和计算机互动起来 语法: 内容 = input(提⽰信息) 这⾥可以直接获取到⽤户输入的内容 content = input("你吃了么?& ...

  2. 苹果 iOS13.2.2 正式版修复闷杀后台问题了?别担心,PerfDog 帮你来检测!

    导语 苹果于上周推送了iOS 13.2版本,带来了用户备受期待的图像处理系统深度融合(Deep Fusion),新增70多个表情.HomeKit安全视频.Siri隐私设置和支持AirPods Pro等 ...

  3. Qt Creator配置MSVC调试器

    安装完QT后会看到Qt Creator中的MSVC构建组件带有黄色的感叹号,那是因为没有调试器的原因.由于Qt-MSVC版本套件没有默认安装调试器, 需要我们自己手动下载安装. 根据官方文档http: ...

  4. 如何使用 CODING 进行瀑布流式研发

    你好,欢迎使用CODING!这份最佳实践将帮助你通过 CODING 更好地实践瀑布流式开发流程. 什么是瀑布流式研发 1970 年温斯顿·罗伊斯(Winston Royce)提出了著名的"瀑 ...

  5. [b0005] Linux 系统常用操作命令

    1 Ubuntu 解压 hadoop@ssmaster:~$ -bin-hadoop2..tgz 联网安装程序包 sudo apt-get install php

  6. C# 集合的交集 差集 并集 去重

    C# 集合的交集 差集 并集 去重 两个对象list,直接比较是不行的,因为他们存的地址不一样 需要重写GetHashCode()与Equals(object obj)方法告诉电脑 class Stu ...

  7. appium---元素定位方法

    在我们做自动化测试的过程中,最基本的就是要会元素定位,也是自动化中的灵魂所在,如果一个自动化测试工程师说不会定位元素定位,那么肯定也不会做自动化了. 如何查看元素 小伙伴们都知道如果是web端可以通过 ...

  8. 环形链表 II

    给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 - ...

  9. input 控件常用属性

  10. MySQL学习笔记6——备份与恢复

    备份与恢复 备份与恢复 数据库-->sql:备份 sql-->数据库:恢复 1.数据库导出SQL脚本 >mysqldump -u用户名 -p密码 数据库名>生成的脚本文件路径 ...