这篇文章应该是承接
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)
未完待续...