从C++11到C++23(四)统计某个数目中1的个数

代码链接见:https://wandbox.org/permlink/sIdpRyLe4utkecEq

C++20提供了一个新的 <bit> 头文件用于提供一些位运算,其中popcount可用于统计一个数目中1的个数。
如果你想统计一个2/8/16进制数目中1的个数,这个函数就非常方便了:

#include <bit>
#include <bitset>
#include <cstdint>
#include <initializer_list>
#include <iostream>
 
int main()
{
    for (std::uint8_t i : { 0, 0b11111111, 0b00011101 }) {
        std::cout << "popcount(0b" << std::bitset<8>(i) << ") = "
                  << std::popcount(i) << '\n';
    }
}
/*
output:
popcount(0b00000000) = 0
popcount(0b11111111) = 8
popcount(0b00011101) = 4
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的LL(1)语法分析程序,包括生成预测分析表C和打印预测分析表C的代码。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_ROW 10 #define MAX_COL 10 char first[MAX_ROW][MAX_COL][MAX_COL]; int first_count[MAX_ROW][MAX_COL]; char follow[MAX_ROW][MAX_COL][MAX_COL]; int follow_count[MAX_ROW][MAX_COL]; char table[MAX_ROW][MAX_COL][MAX_COL]; int table_row_count[MAX_ROW]; void print_first(int non_terminal, int terminal) { printf("FIRST[%d][%d] = { ", non_terminal, terminal); for (int i = 0; i < first_count[non_terminal][terminal]; i++) { printf("%c ", first[non_terminal][terminal][i]); } printf("}\n"); } void print_follow(int non_terminal) { printf("FOLLOW[%d] = { ", non_terminal); for (int i = 0; i < follow_count[non_terminal][0]; i++) { printf("%c ", follow[non_terminal][0][i]); } printf("}\n"); } void print_table_row(int non_terminal) { printf("C[%d] = { ", non_terminal); for (int i = 0; i < table_row_count[non_terminal]; i++) { printf("%c -> %s, ", table[non_terminal][i][0], table[non_terminal][i] + 2); } printf("}\n"); } int main() { // 初始化 for (int i = 0; i < MAX_ROW; i++) { for (int j = 0; j < MAX_COL; j++) { first_count[i][j] = 0; follow_count[i][j] = 0; table_row_count[i] = 0; } } // TODO: 填充first, follow和table数组 // 打印预测分析表C for (int i = 0; i < MAX_ROW; i++) { if (table_row_count[i] > 0) { print_table_row(i); } } return 0; } ``` 其,`first`数组用于存储非终结符和终结符的FIRST集,`first_count`数组用于记录每个FIRST集元素的个数;`follow`数组用于存储非终结符的FOLLOW集,`follow_count`数组用于记录每个FOLLOW集元素的个数;`table`数组用于存储预测分析表C,`table_row_count`数组用于记录每个非终结符的表项数目。 在填充完`first`、`follow`和`table`数组后,我们可以通过以下代码打印预测分析表C: ```c // 打印预测分析表C for (int i = 0; i < MAX_ROW; i++) { if (table_row_count[i] > 0) { print_table_row(i); } } ``` 其,`print_table_row`函数用于打印预测分析表C某个非终结符对应的表项: ```c void print_table_row(int non_terminal) { printf("C[%d] = { ", non_terminal); for (int i = 0; i < table_row_count[non_terminal]; i++) { printf("%c -> %s, ", table[non_terminal][i][0], table[non_terminal][i] + 2); } printf("}\n"); } ``` 该函数首先打印非终结符的编号,然后依次打印该非终结符的每个表项,每个表项包括一个终结符和对应的产生式。注意,在`table`数组,每个表项的第一个字符为终结符,后面跟着一个箭头符号`->`和对应的产生式。因此,我们需要通过`table[non_terminal][i][0]`和`table[non_terminal][i] + 2`分别获取表项的终结符和产生式,并将其打印出来。 综上,我们可以使用以上代码实现LL(1)语法分析程序,并打印预测分析表C。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值