Ruby的运算符!和数据类型Numbers小结
这篇文章应该是承接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 = 0x000000ffb = n<<3a = 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) 未完待续...
页:
[1]