Go语言圣经练习6.1~6.5

前言

位运算操作比较多,练练手。
代码分两块 一个是代码部分,另一个是测试代码部分。使用 go test xxx 返回ok即正确。

题目:
练习6.1: 为bit数组实现Len, Remove, Copy, Clear
练习6.2: 定义一个变参方法(*IntSet).AddAll(…int),这个方法可以为一组IntSet值求和,比如 s.AddAll(1,2,3)。
练习6.3:并集、差集、对称差
练习6.4: 返回可迭代的列表
练习6.5:将 64改成按平台自动确定取32或64.

代码

运行代码

// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan.
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/

// See page 165.

// Package intset provides a set of integers based on a bit vector.
package intset

import (
	"bytes"
	"fmt"
)

//!+intset

// An IntSet is a set of small non-negative integers.
// Its zero value represents the empty set.
const bit = 32 << (^uint(0) >> 63)
type IntSet struct {
   
	words []uint
}

// Has reports whether the set contains the non-negative value x.
func (s *IntSet) Has(x int) bool {
   
	word, bit := x/bit, uint(x%bit)
	return word < len(s.words) && s.words[word]&(1<<bit) != 0
}

// Add adds the non-negative value x to the set.
func (s *IntSet) Add(x int) {
   
	word, bit := x/bit, uint(x%bit)
	for word >= len(s.words) {
   
		s.words = append(s.words, 0)
	}
	s.words[word] |= 1 << bit
}

// UnionWith sets s to the union of s and t.
func (s *IntSet) UnionWith(t *IntSet) {
   
	for i, tword := range t.words {
   
		if i < len(s.words) {
   
			s.words[i] |= tword
		} else {
   
			s.words = append(s.words, tword)
		}
	}
}

// IntersectWith sets s to the intersect of s and t.
func (s *IntSet) IntersectWith(t *IntSet) *IntSet {
   
	var z IntSet
	for i, tword := range t.words {
   
		if i < len(s.words) {
   
			z.words = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值