lua程序设计(第四版)练习答案自做(第十三章)

仓库

正文

page136
	string.format("%x",0xff & 0xabcd)

上例中f即二进制11110xff前面的所有位为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
  1. 加法、减法、乘法操作对于有符号整型和无符号整型是一样的

  2. 关系运算对于有符号整型和无符号整型是一样的

    • 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值