Bit 数组

// An IntSet is a set of small non-negative integers.
// Its zero value represents the empty set.
type IntSet struct {
	words []uint64
}

// Has reports whether the set contains the non-negative value x.
func (s *IntSet) Has(x int) bool {
	word, bit := x/64, uint(x%64)
	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/64, uint(x%64)
	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)
		}
	}
}


Go语言圣经    gopl.io/ch6/intset

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解了你的要求。以下是我对你的问题的回答: 首先,根据你的要求,我们需要动态建立3个缓冲区和3个邮箱。这可以使用RT-Thread的内存管理和邮箱功能来实现。可以使用以下代码: ```c #define MAIL_POOL_SIZE 16 static uint32_t mail_pool_buf_1[MAIL_POOL_SIZE]; static uint32_t mail_pool_buf_2[MAIL_POOL_SIZE]; static uint32_t mail_pool_buf_3[MAIL_POOL_SIZE]; static struct rt_mailbox mb_1; static struct rt_mailbox mb_2; static struct rt_mailbox mb_3; void init_mailbox(void) { rt_mailbox_init(&mb_1, "mb_1", &mail_pool_buf_1[0], MAIL_POOL_SIZE, sizeof(uint32_t)); rt_mailbox_init(&mb_2, "mb_2", &mail_pool_buf_2[0], MAIL_POOL_SIZE, sizeof(uint32_t)); rt_mailbox_init(&mb_3, "mb_3", &mail_pool_buf_3[0], MAIL_POOL_SIZE, sizeof(uint32_t)); } ``` 接下来,我们需要动态创建3个线程来发送邮件。每个sender线程都需要一个数据帧结构体data_frame。数据帧结构体定义如下: ```c typedef struct { uint32_t time_slice_ID; uint32_t data; } data_frame; ``` 可以使用以下代码来创建sender线程: ```c #define THREAD_STACK_SIZE 512 #define THREAD_PRIORITY 25 static rt_thread_t sender_thread_1 = RT_NULL; static rt_thread_t sender_thread_2 = RT_NULL; static rt_thread_t sender_thread_3 = RT_NULL; static data_frame data_frame_1; static data_frame data_frame_2; static data_frame data_frame_3; void sender_thread_entry(void *parameter) { rt_uint32_t index = *(rt_uint32_t *)parameter; rt_mailbox_t mb; data_frame *frame; switch (index) { case 1: mb = &mb_1; frame = &data_frame_1; break; case 2: mb = &mb_2; frame = &data_frame_2; break; case 3: mb = &mb_3; frame = &data_frame_3; break; default: return; } frame->time_slice_ID = 0; frame->data = 0; while (1) { /* 更新数据帧中的时间片和数据 */ frame->time_slice_ID++; frame->data = index; /* 发送数据帧到邮箱中 */ rt_err_t result = rt_mb_send_wait(mb, (rt_uint32_t)frame, RT_WAITING_FOREVER); if (result != RT_EOK) { rt_kprintf("send email failed: %d\n", result); } /* 等待200ms */ rt_thread_mdelay(200); } } void init_sender_threads(void) { rt_err_t result; result = rt_thread_init(&sender_thread_1, "sender_1", sender_thread_entry, (void *)1, &sender_thread_stack_1[0], THREAD_STACK_SIZE, THREAD_PRIORITY, 5); if (result == RT_EOK) { rt_thread_startup(&sender_thread_1); } result = rt_thread_init(&sender_thread_2, "sender_2", sender_thread_entry, (void *)2, &sender_thread_stack_2[0], THREAD_STACK_SIZE, THREAD_PRIORITY, 5); if (result == RT_EOK) { rt_thread_startup(&sender_thread_2); } result = rt_thread_init(&sender_thread_3, "sender_3", sender_thread_entry, (void *)3, &sender_thread_stack_3[0], THREAD_STACK_SIZE, THREAD_PRIORITY, 5); if (result == RT_EOK) { rt_thread_startup(&sender_thread_3); } } ``` 最后,我们需要创建3个线程来接收邮件并通过串口打印出来。可以使用以下代码来创建这些线程: ```c #define RECEIVER_STACK_SIZE 512 #define RECEIVER_PRIORITY 25 static rt_thread_t receiver_thread_1 = RT_NULL; static rt_thread_t receiver_thread_2 = RT_NULL; static rt_thread_t receiver_thread_3 = RT_NULL; void receiver_thread_entry(void *parameter) { rt_uint32_t index = *(rt_uint32_t *)parameter; rt_mailbox_t mb; data_frame *frame; switch (index) { case 1: mb = &mb_1; break; case 2: mb = &mb_2; break; case 3: mb = &mb_3; break; default: return; } while (1) { /* 从邮箱中接收数据帧 */ rt_uint32_t value; rt_err_t result = rt_mb_recv(mb, &value, RT_WAITING_FOREVER); if (result == RT_EOK) { frame = (data_frame *)value; rt_kprintf("receiver_%d: time_slice_ID=%d, data=%d\n", index, frame->time_slice_ID, frame->data); } } } void init_receiver_threads(void) { rt_err_t result; result = rt_thread_init(&receiver_thread_1, "receiver_1", receiver_thread_entry, (void *)1, &receiver_thread_stack_1[0], RECEIVER_STACK_SIZE, RECEIVER_PRIORITY, 5); if (result == RT_EOK) { rt_thread_startup(&receiver_thread_1); } result = rt_thread_init(&receiver_thread_2, "receiver_2", receiver_thread_entry, (void *)2, &receiver_thread_stack_2[0], RECEIVER_STACK_SIZE, RECEIVER_PRIORITY, 5); if (result == RT_EOK) { rt_thread_startup(&receiver_thread_2); } result = rt_thread_init(&receiver_thread_3, "receiver_3", receiver_thread_entry, (void *)3, &receiver_thread_stack_3[0], RECEIVER_STACK_SIZE, RECEIVER_PRIORITY, 5); if (result == RT_EOK) { rt_thread_startup(&receiver_thread_3); } } ``` 最后,在main函数中调用init_mailbox、init_sender_threads和init_receiver_threads函数即可完成任务。 ```c int main(void) { init_mailbox(); init_sender_threads(); init_receiver_threads(); return 0; } ``` 以上就是这个任务的实现。希望能够帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值