正文
page136
string.format("%x",0xff & 0xabcd)
上例中f即二进制1111,0xff前面的所有位为0,后面八位为1。& 运算中, &1即不变, &0即为0,故0xabcd只有后面的cd不变,前面的位都变为0.
string.format("%x",0xff | 0xabcd)
同上,但是 | 运算中, |1即为1, |0即不变,故 0xabcd中,ab所在的位不变,而cd所在的位因为都变成了1,按照16进制计数法即ff。
string.format("%x",0xaaaa ~ -1)
按补码记法, -1的所有二进制位都是1 ,16进制中a转换为二进制1010。在 ~ 异或运算中, ~1即切换,意思是0变成1,1变成0,故1010变为0101,即5。而前面的所有二进制位都变成1。
string.format("%x",~0)
按补码记法,0的所有二进制位都是0,故取反后所有位都是1。在标准lua中整型是64位,转换成16进制即16位f。
page138
-
加法、减法、乘法操作对于有符号整型和无符号整型是一样的
-
关系运算对于有符号整型和无符号整型是不一样的
- math.ult()用来比较无符号整型的大小
- 也可以在比较无符号整型前先用掩码屏蔽符号位
page141
x=string.pack("i7",1<<55)
这里会报错的原因是,我们明确要打包的是7字节的整型数,而1<<55即 2 55 2^{55} 255溢出了。
13.1
#!/usr/bin/lua
function umod(n,m)
while not math.ult(n,m) do
n=n-m
print(string.format("n=%u",n))
end
return n
end
13.2
不清楚这里的位数是指有多少位数,还是指整型数占多少个二进制位。所以待完善。
13.3
#!/usr/bin/lua
function powtwo(num)
if num&(num-1)==0 then
return true
else
return false
end
end
13.4
#!/usr/bin/lua
function hamming(num)
local count=0
while num~=0 do
if num&1==1 then
count=count+1
end
num=num>>1
end
return count
end
13.5
#!/usr/bin/lua
function isrev(num)
s=""
while num~=0 do
s=num&1==1 and s.."1" or s.."0"
num=num>>1
end
if s==string.reverse(s) then
return true
else
return false
end
end
13.6
#!/usr/bin/lua
function newBitArray(n)
local a={}
return a
end
function setBit(a,n,v)
a[n]=v
end
function testBit(a,n)
return a[n]
end
不知道题目的意思是不是要求用位操作来完成,有时间再来补充。
13.7
#!/usr/bin/lua
local sum=0
local f=assert(io.open(arg[1],"rb"))
local blocksize=11
for bytes in f:lines(blocksize) do
_,_,t=string.unpack("ibf",bytes)
sum=sum+t
end
return sum