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

这篇文章应该是承接

SSD06 Exercise02 个人解答

文章的,由于原问题中必需用c解答所以我就单独作为一篇文章来解释并做了完整的补充。

首先,大家需要明确Ruby是无法用按题目中的要求解决问题的,至少直接将C的代码翻译过来是不行的。

原因是:运算符 ! 的使用范围被限制了 (原始的C语言作用的数据有基本数据,但是Ruby语言作用的一切数据都是对象),对于对象的!(非)运算效果有很大不同。Ruby中所有的对象都有一个boolean值,除了false、nil两个const对象的结果为false以外,其它对象的值都为true.

wpc@wpc-laptop:~$ irb
irb(main):001:0> !0
=> false
irb(main):002:0> !1
=> false
irb(main):003:0> !-1
=> false
irb(main):004:0> !01
=> false
irb(main):005:0> !0x1
=> false
irb(main):006:0> !-0x1
=> false
irb(main):007:0> !-01
=> false
irb(main):008:0> false
=> false
irb(main):009:0> !false
=> true
irb(main):010:0> nil
=> nil
irb(main):011:0> !nil
=> true

 其次,我们不能通过不带负号(-)的数据(例如:二进制、八进制、十六进制)来使数据为负值。

数据格式:

  • 0 377 八进制在数字前面加一个: 0
  • 0b 1111_1011 二进制在数字前面加: 0b
  • 0x FF 十六进制在数字前面加: 0x
wpc@wpc-laptop:~$ irb
irb(main):001:0> 1
=> 1
irb(main):002:0> -1
=> -1
irb(main):003:0> 0xffffffff
=> 4294967295
irb(main):004:0> 0x0
=> 0
irb(main):005:0> -0xffffffff
=> -4294967295
irb(main):006:0> 0b1111
=> 15
irb(main):007:0> -0b1111
=> -15
irb(main):008:0> -0b11111111111111111111111111111111
=> -4294967295
irb(main):009:0> 0b11111111111111111111111111111111
=> 4294967295

 最后,我们可以通过位运算符操作来得到正负的转换.

题目的部分解答:

def bitAnd(x,y)
  (~(~x|~y))
end

def bitOr(x,y)
  (~(~x&~y))
end

def isZero(x)
  !(a^0)
end

def minusOne()
  # postive of i : ~i = -(i+1)
  ~0
end

def tmax()
  ~(1<<31)
end

def bitXor(x,y)
  ~((~(x&(~y)))&(~((~x)&y)))
end

def getByte(x,n)
  a = 0x000000ff
  b = n<<3
  a = a<<b
  (x&a)>>b
end

def isEqual(x,y)
  !(x^y)
end

def negate(x)
  ~x+1
end

def isPositive(x)
  !((x>>31)&1 | !x)
end

p tmax
p minusOne
p 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)
 

未完待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值