六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 43|回复: 0

Ruby的运算符!和数据类型Numbers小结

[复制链接]

升级  1.6%

154

主题

154

主题

154

主题

进士

Rank: 4

积分
508
 楼主| 发表于 2013-1-27 04:44:20 | 显示全部楼层 |阅读模式
这篇文章应该是承接
SSD06 Exercise02 个人解答

文章的,由于原问题中必需用c解答所以我就单独作为一篇文章来解释并做了完整的补充。
首先,大家需要明确Ruby是无法用按题目中的要求解决问题的,至少直接将C的代码翻译过来是不行的。
原因是:运算符 ! 的使用范围被限制了(原始的C语言作用的数据有基本数据,但是Ruby语言作用的一切数据都是对象),对于对象的!(非)运算效果有很大不同。Ruby中所有的对象都有一个boolean值,除了false、nil两个const对象的结果为false以外,其它对象的值都为true.
wpc@wpc-laptop:~$ irbirb(main):001:0> !0=> falseirb(main):002:0> !1=> falseirb(main):003:0> !-1=> falseirb(main):004:0> !01=> falseirb(main):005:0> !0x1=> falseirb(main):006:0> !-0x1=> falseirb(main):007:0> !-01=> falseirb(main):008:0> false=> falseirb(main):009:0> !false=> trueirb(main):010:0> nil=> nilirb(main):011:0> !nil=> true 其次,我们不能通过不带负号(-)的数据(例如:二进制、八进制、十六进制)来使数据为负值。
数据格式:

  • 0377 八进制在数字前面加一个: 0
  • 0b1111_1011 二进制在数字前面加: 0b
  • 0xFF 十六进制在数字前面加: 0x
wpc@wpc-laptop:~$ irbirb(main):001:0> 1=> 1irb(main):002:0> -1=> -1irb(main):003:0> 0xffffffff=> 4294967295irb(main):004:0> 0x0=> 0irb(main):005:0> -0xffffffff=> -4294967295irb(main):006:0> 0b1111=> 15irb(main):007:0> -0b1111=> -15irb(main):008:0> -0b11111111111111111111111111111111=> -4294967295irb(main):009:0> 0b11111111111111111111111111111111=> 4294967295 最后,我们可以通过位运算符操作来得到正负的转换.
题目的部分解答:
def bitAnd(x,y)  (~(~x|~y))enddef bitOr(x,y)  (~(~x&~y))enddef isZero(x)  !(a^0)enddef minusOne()  # postive of i : ~i = -(i+1)  ~0enddef tmax()  ~(1<<31)enddef bitXor(x,y)  ~((~(x&(~y)))&(~((~x)&y)))enddef getByte(x,n)  a = 0x000000ff  b = n<<3  a = a<<b  (x&a)>>benddef isEqual(x,y)  !(x^y)enddef negate(x)  ~x+1enddef isPositive(x)  !((x>>31)&1 | !x)endp tmaxp minusOnep negate(1)p negate(2)p negate(-3)p bitAnd(1,0)p bitXor(1,0)p bitOr(1,0)p getByte(0x12345678,3).to_s(16) 未完待续...
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表