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