前言
位运算操作比较多,练练手。
代码分两块 一个是代码部分,另一个是测试代码部分。使用 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 =