FISCO BCOS V3.0 Air建链体验——对比V2.9建链差别

 前提

 好久不见,最近因为毕业的手续等问题,一直都没有更新,FISCO BCOS第二季task挑战赛如期展开啦,因为毕业的问题,也是非常遗憾的错过了上一期的task挑战赛,这一期一定双倍挑战,hhhhhh

Air版本FISCO BCOS采用all-in-one的封装模式,将所有模块编译成一个二进制(进程),一个进程即为一个区块链节点,包括网络、共识、接入等所有功能模块,适用于初学者入门、功能验证、POC产品。

所以我们这篇文章会更加注重的去讲3.0Air和2.0的区别,以便于各位更加轻松的向3.0进行转型

环境:Ubuntu20

        FISCO BCOS V3.0 rc1

正文

首先咱们先看第一个区别,第一个区别最大的地方还是在体验上,起链的时候虽然一如既往的使用了build_chain,但是增加了许多新的选项参数,比如

build_chain 2.X 版本的help

参数  

功能

-l<IP list>[必需]“ip1:nodeNum1,ip2:nodeNum2”例如:“192.168.0.1:2192.168.0.2:3”
 -f<IP list file>[可选]按行拆分,每行应为“IP:nodeNum agencyName groupList p2p_port,channel_port,
-v<FISCO-BCOS二进制版本>默认为最新的v${Default_version}t,
-e<FISCO-BCOS二进制路径>默认从GitHub下载FISCO-BCOS。如果设置-e,则在指定位置使用二进制
-o<输出方向>默认值/节点/
-p<开始端口>默认30300202008545表示p2p_Port从30300开始,channel_Port从20200开始,jsonrpc_Port从8545开始
-q<列出FISCO-BCOS发布>列出FISCO-BCOS发布版本
-i<主机ip>默认127.0.0.1。如果设置-i,则侦听0.0.0.0
-s<DB类型>默认RocksDB。选项可以是RocksDB/MySQL/Scalible,建议使用RocksDB
-d<docker mode>默认关闭。如果设置为-d,则使用docker构建
-c<共识算法>默认PBFT。选项可以是pbft/rraft/rpbft,建议使用pbft
-C<Chain id>默认值1。可以设置uint。
-g<生成国密节点>默认否
-z<生成tar数据包>默认否
-t<证书配置文件>默认自动生成
-6<使用ipv6>默认编号。如果设置为-6,则将IP视为ipv6
-k<ca根的路径>默认自动生成,ca.crt和ca.key必须在路径中,如果使用中间值,则root.crt必须在路径
-K<sm crypto ca root的路径>默认自动生成,gmca.crt和gmca.key必须在路径中,如果使用中间路径,则gmroot.crt必须在路径
-D<使用部署模式>默认值为false,如果设置为-D,则使用部署模式目录结构并使tar
-G<channel use sm crypto ssl>默认为false,仅适用于国密模式
-X<证书到期时间>默认36500天
-T<启用调试日志>默认关闭。如果设置为-T,则启用调试日志
-R<Channel use ecdsa crypto ssl>默认值为false。如果设置了-R,请为通道ssl使用ecdsa证书,否则将使用rsa证书
-S<启用统计信息>默认关闭。如果设置为-S,则启用统计信息
-F<禁用日志自动刷新>默认打开。如果设置为-F,则禁用日志自动清除
-E<Enable free_storage_evm>默认关闭。如果设置为-E,则启用free_storage _evm
-h帮助

 

 

build_chain 3.X 版本的help

参数  

功能

-C<Command>[可选]命令现在支持“deploy”和“expand”,默认为deploy
-g<group id>[可选]设置组id,默认值:group0
-I<chain id>[可选]设置chain id,默认值:chain0
-v<FISCO-BCOS二进制版本>[可选]默认为最新的v3.4.0
-l<IP list>[必需]“ip1:nodeNum1,ip2:nodeNum2”例如:“192.168.0.1:2192.168.0.2:3”
-L<fisco-bcos lightnode exec>[可选]fisco-bdos 轻节点的好可执行文件,输入“download_binary”下载lightnode二进制文件或指定正确的lightnode二元路径
-e<fisco-bcos exec>〔可选〕

fisco-bcosbinary exec

-t<mtail exec>[可选]mtail二进制exec

-o<output dir>〔可选〕输出目录,默认值/节点
-p<启动端口>〔可选〕默认3030020200表示p2p_port从30300开始,rpc_port从20200开始
-s<SM型号>[可选]SM SSL连接与否,默认为false
-H<HSM型号>[可选]是否使用HSM(硬件安全模块),默认为false
-c<Config Path>〔展开节点时必需〕指定展开节点的路径Config.ini、Config.generion和p2p连接文件nodes.json
-d<CA cert path>[展开节点时必需]展开节点时,指定CA证书和私钥所在的路径
-D<docker模式>默认关闭如果设置为-D,则使用docker构建
如果设置为-D,则使用docker构建当Auth模式时指定管理员帐户地址。
当Auth模式时指定管理员帐户地址。是否使用WASM虚拟机引擎,默认为false
-R<Serial_mode>[可选]是否使用串行执行,默认为true
-k<关键页大小>[可选]关键页大小,默认为10240
关键页大小,默认为10240节点监视器与否,默认值为false
节点监视器与否,默认值为false展开节点时,应指定ip和端口
展开节点时,应指定ip和端口展开节点时,指定prometheus所在的路径
-z<生成tar包>〔可选〕将数据打包到链上生成tar包
-n<node-key path>[可选]设置要加载nodeid的节点密钥文件的路径
-N<node path>[可选]-N<node path>[可选]
-u<multi-ca-path>[可选]-u<multi-ca-path>[可选]
-h帮助

我们可以通过脚本的新增参数发现,多乐许多不一样的地方,比如轻节点的概念,亦或者是-d的功能改成--D了,都有不同的变化,那么我们本篇就以启动一个FISCO BCOS V3.0 Air来试一下轻量级的变化

起链对比

V3.0 起链

bash ../tools/build_chain.sh -p 30300,20200 -l 127.0.0.1:4 -o nodes

 V2.0起链

bash ../tools/build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -o nodes

 返回消息对比

与2.0相比起链少了一个指定的8545的端口,默认的起链命令倒是没什么变化

 相较于2.0来说多了很多返回的内容,例如:

Processing IP:127.0.0.1 Total:4
writing RSA key
[INFO] Generate nodes/127.0.0.1/sdk cert successful!
writing RSA key
[INFO] Generate nodes/127.0.0.1/node0/conf cert successful!
writing RSA key
[INFO] Generate nodes/127.0.0.1/node1/conf cert successful!
writing RSA key
[INFO] Generate nodes/127.0.0.1/node2/conf cert successful!
writing RSA key
[INFO] Generate nodes/127.0.0.1/node3/conf cert successful!
[INFO] Downloading get_account.sh from https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/tools/get_account.sh...

这里的返回指的是,创建了RSA的秘钥,RSA秘钥指的是非对称加密算法的秘钥,也就是我们所说的公私钥

 

[INFO] Admin account: 0x984a17c383a35dcc7da48924ca83c078ae384790
[INFO] Generate uuid success: 0578afd8-df1e-49ae-bf93-f01105e33500
[INFO] Generate uuid success: 8505abdf-5c60-45cf-b8d8-94ae641e1e5f
[INFO] Generate uuid success: dae56b62-0584-486c-821a-b5499dd3d2b9
[INFO] Generate uuid success: fd0d62e6-15a6-4422-bb3b-c9ade14a283e

 这里的返回是UUID,UUID是我们分布式系统中常见的唯一性表示,就和物理mac地址一样 

[INFO] GroupID              : group0
[INFO] ChainID              : chain0
[INFO] fisco-bcos path      : bin/fisco-bcos
[INFO] Auth mode            : false
[INFO] Start port           : 30300 20200
[INFO] Server IP            : 127.0.0.1:4
[INFO] SM model             : false
[INFO] enable HSM           : false
[INFO] Output dir           : nodes
[INFO] All completed. Files in nodes

这里就是一些基本情况的阐述

文件目录对比

最终生成的目录对比,我们发现3.0多了许多证书类,监控类的文件,这意味着我们的3.0更加安全,完善

V3.0nodes/
├── monitor
│   ├── grafana # grafana配置文件
│   ├── prometheus # prometheus配置文件
│   ├── start_monitor.sh # 启动脚本,用于开启监控
│   ├── stop_monitor.sh # 停止脚本,用于停止监控
│   ├── compose.yaml # docker-compose配置文件
├── 127.0.0.1
│   ├── fisco-bcos # 二进制程序
│   ├── mtail # 二进制程序
│   ├── node0 # 节点0文件夹
│   │   ├── mtail # mtail配置文件夹
│   │   │   ├── start_mtail_monitor.sh  # 启动脚本,用于启动该节点mtail程序
│   │   │   ├── stop_mtail_monitor.sh   # 停止脚本,用于停止该节点mtail程序
│   │   │   ├── node.mtail # mtail配置文件
│   │   ├── conf # 配置文件夹
│   │   │   ├── ca.crt # 链根证书
│   │   │   ├── cert.cnf
│   │   │   ├── ssl.crt # ssl证书
│   │   │   ├── ssl.key # ssl连接证书私钥
│   │   │   ├── node.pem # 节点签名私钥文件
│   │   │   ├── node.nodeid # 节点id,公钥的16进制表示
│   │   ├── config.ini # 节点主配置文件,配置监听IP、端口、证书、日志等
│   │   ├── config.genesis # 创世配置文件,共识算法类型、共识超时时间和交易gas限制等
│   │   ├── nodes.json # 节点json信息,展示节点的ip和端口,示例:{"nodes": [127.0.0.1:30300]}
│   │   ├── start.sh # 启动脚本,用于启动节点
│   │   └── stop.sh # 停止脚本,用于停止节点
│   ├── node1 # 节点1文件夹
│   │.....
│   ├── node2 # 节点2文件夹
│   │.....
│   ├── node3 # 节点3文件夹
│   │.....
│   ├── sdk # SDK证书
│   │   ├── ca.crt # SSL连接根证书
│   │   ├── cert.cnf # 证书配置
│   │   ├── sdk.crt # SDK根证书
│   │   ├── sdk.key # SDK证书私钥
│   ├── start_all.sh # 启动脚本,用于启动所有节点
│   ├── stop_all.sh # 停止脚本,用于停止所有节点
V2.0nodes/
├── 127.0.0.1
│   ├── download_bin.sh
│   ├── download_console.sh
│   ├── fisco-bcos
│   ├── node0
│   │   ├── conf
│   │   │   ├── ca.crt
│   │   │   ├── group.1.genesis
│   │   │   ├── group.1.ini
│   │   │   ├── node.crt
│   │   │   ├── node.key
│   │   │   └── node.nodeid
│   │   ├── config.ini
│   │   ├── scripts
│   │   │   ├── load_new_groups.sh
│   │   │   ├── monitor.sh
│   │   │   ├── reload_sdk_allowlist.sh
│   │   │   └── reload_whitelist.sh
│   │   ├── start.sh
│   │   └── stop.sh
│   ├── node1
│   │   ├── conf
│   │   │   ├── ca.crt
│   │   │   ├── group.1.genesis
│   │   │   ├── group.1.ini
│   │   │   ├── node.crt
│   │   │   ├── node.key
│   │   │   └── node.nodeid
│   │   ├── config.ini
│   │   ├── scripts
│   │   │   ├── load_new_groups.sh
│   │   │   ├── monitor.sh
│   │   │   ├── reload_sdk_allowlist.sh
│   │   │   └── reload_whitelist.sh
│   │   ├── start.sh
│   │   └── stop.sh
│   ├── node2
│   │   ├── conf
│   │   │   ├── ca.crt
│   │   │   ├── group.1.genesis
│   │   │   ├── group.1.ini
│   │   │   ├── node.crt
│   │   │   ├── node.key
│   │   │   └── node.nodeid
│   │   ├── config.ini
│   │   ├── scripts
│   │   │   ├── load_new_groups.sh
│   │   │   ├── monitor.sh
│   │   │   ├── reload_sdk_allowlist.sh
│   │   │   └── reload_whitelist.sh
│   │   ├── start.sh
│   │   └── stop.sh
│   ├── node3
│   │   ├── conf
│   │   │   ├── ca.crt
│   │   │   ├── group.1.genesis
│   │   │   ├── group.1.ini
│   │   │   ├── node.crt
│   │   │   ├── node.key
│   │   │   └── node.nodeid
│   │   ├── config.ini
│   │   ├── scripts
│   │   │   ├── load_new_groups.sh
│   │   │   ├── monitor.sh
│   │   │   ├── reload_sdk_allowlist.sh
│   │   │   └── reload_whitelist.sh
│   │   ├── start.sh
│   │   └── stop.sh
│   ├── sdk
│   │   ├── ca.crt
│   │   ├── sdk.crt
│   │   ├── sdk.key
│   │   └── sdk.publickey
│   ├── start_all.sh
│   └── stop_all.sh
├── cert
│   ├── agency
│   │   ├── agency.crt
│   │   ├── agency.key
│   │   ├── agency.srl
│   │   ├── ca.crt
│   │   └── cert.cnf
│   ├── ca.crt
│   ├── ca.key
│   ├── ca.srl
│   └── cert.cnf
└── cert.cnf

起链返回内容

这里更新了启动进程不仅仅是返回启动成功,并且将进程号也一并返回了

V3.0try to start node0
try to start node1
try to start node2
try to start node3node3 start successfully pid=5947node2 start successfully pid=5957node1 start successfully pid=5962node0 start successfully pid=5951
V2.0try to start node0
try to start node1
try to start node2
try to start node3node2 start successfullynode1 start successfullynode0 start successfullynode3 start successfully

扩容节点对比

V3.0# 创建扩容配置存放目录
$ mkdir config# 拷贝根证书、根证书私钥
$ cp -r nodes/ca config# 从被扩容节点node0拷贝节点配置文件config.ini,创世块配置文件config.genesis以及节点连接配置文件nodes.json
$ cp nodes/127.0.0.1/node0/config.ini config/
$ cp nodes/127.0.0.1/node0/config.genesis config/
$ cp nodes/127.0.0.1/node0/nodes.json config/nodes.json.tmp# 设置新节点P2P和RPC监听端口
# macOS系统(设置P2P监听端口为30304,RPC监听端口为20204)
$ sed -i .bkp 's/listen_port=30300/listen_port=30304/g' config/config.ini
$ sed -i .bkp 's/listen_port=20200/listen_port=20204/g' config/config.ini
# linux系统(设置P2P监听端口为30304,RPC监听端口为20204)
$ sed -i 's/listen_port=30300/listen_port=30304/g' config/config.ini
$ sed -i 's/listen_port=20200/listen_port=20204/g' config/config.ini# 将新节点连接加入到nodes.json
$ sed -e 's/"nodes":\[/"nodes":\["127.0.0.1:30304",/' config/nodes.json.tmp > config/nodes.json
# 确认新节点连接信息: 127.0.0.1:30304加入成功
$ cat config/nodes.json
{"nodes":["127.0.0.1:30304","127.0.0.1:30300","127.0.0.1:30301","127.0.0.1:30302","127.0.0.1:30303"]}扩容节点
# 调用build_chain.sh扩容节点,新节点扩容到nodes/127.0.0.1/node4目录
# -c: 指定扩容配置config.ini, config.genesis和nodes.json路径
# -d: 指定CA证书和私钥的路径
# -o: 指定扩容节点配置所在目录
bash ../tools/build_chain.sh -C expand -c config -d config/ca -o nodes/127.0.0.1/node4cat ~fisco/nodes/127.0.0.1/node4/conf/node.nodeidcp -rf nodes/127.0.0.1/sdk/* console/conf/#这里可以根据自己的实际情况来改,我就不改了直接使用示例文件
cp -rf console/conf/config-example.toml console/conf/config.tomladdObserveraddSealer

V2.0curl -#LO https://raw.githubusercontent.com/FISCO-BCOS/FISCO-BCOS/master-2.0/tools/gen_node_cert.sh# -c指定机构证书及私钥所在路径
# -o输出到指定文件夹,其中node4/conf中会存在机构agency新签发的证书和私钥
# 成功会输出 All completed 提示
bash gen_node_cert.sh -c ../cert/agency -o node4cp node0/config.ini node0/start.sh node0/stop.sh node4/#修改node4/config.ini。对于[rpc]模块,修改channel_listen_port=20204和jsonrpc_listen_port=8549;对于[p2p]模块,修改listen_port=30304并在node.中增加自身节点信息;cp node0/conf/group.1.genesis node0/conf/group.1.ini node4/conf/bash node4/start.shcat node4/conf/node.nodeidgetObserverListaddSealer 

这里我们可以发现,v3.0的扩容步骤明显多于且复杂于v2.0,所以我们这里可以,仔细的分析一下里面为什么要这么做

V3.0对于证书的要求明显是更加的严格了,引入了2.0所没有的证书文件,以及加密方式,但是对于轻量级的版本来说又不如pro或者max那版复杂,剩下的我们在下一篇中来分享搭建pro以及max版本所体会到的感受

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/31399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试热题(单词搜索)

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相…

机器学习笔记 - 关于GPT-4的一些问题清单

一、简述 据报道,GPT-4 的系统由八个模型组成,每个模型都有 2200 亿个参数。GPT-4 的参数总数估计约为 1.76 万亿个。 近年来,得益于 GPT-4 等高级语言模型的发展,自然语言处理(NLP) 取得了长足的进步。凭借其前所未有的规模和能力,GPT-4为语言 AI​​设立了新标准,并为机…

【三维重建】【深度学习】instant-nsr-pl代码Pytorch实现--训练自己的数据集

【三维重建】【深度学习】instant-nsr-pl代码Pytorch实现–训练自己的数据集 基于Instant-NGP的神经表面重建&#xff1a;该存储库包含 NeRF 和 NeuS 的简洁且可扩展的实现&#xff0c;用于基于 Instant-NGP 和 Pytorch-Lightning 框架的神经表面重建&#xff0c;旨在为基于 Ne…

力扣初级算法(旋转矩阵)

力扣初级算法(旋转矩阵) 每日一算法&#xff1a;旋转矩阵 学习内容&#xff1a; 1.问题&#xff1a; 给你一幅由 N N 矩阵表示的图像&#xff0c;其中每个像素的大小为 4 字节。请你设计一种算法&#xff0c;将图像旋转 90 度。 不占用额外内存空间能否做到&#xff1f; 2.…

vue+springboot基于web的火车高铁铁路订票管理系统

铁路订票管理系统按照权限的类型进行划分&#xff0c;分为用户和管理员两个模块。管理员模块主要针对整个系统的管理进行设计&#xff0c;提高了管理的效率和标准。主要功能包括个人中心、用户管理、火车类型管理、火车信息管理、车票预订管理、车票退票管理、系统管理等&#…

uniapp-----封装接口

系列文章目录 uniapp-----封装接口 uniapp-----分包 文章目录 系列文章目录 uniapp-----封装接口 uniapp-----分包 文章目录 前言 一、技术 二、封装步骤 1.准备 ​编辑 2.代码填充 request.js&#xff1a; api.js&#xff1a; min.js 页面使用 总结 前言 uni…

mysql索引的数据结构(Innodb)

首选要注意,这里的数据结构是存储在硬盘上的数据结构,不是内存中的数据结构,要重点考虑io次数. 一.不适合的数据结构: 1.Hash:不适合进行范围查询和模糊匹配查询.(有些数据库索引会使用Hash,但是只能精准匹配) 2.红黑树:可以范围查询和模糊匹配,但是和硬盘io次数比较多. 二…

vue : 无法加载文件 C:\Users\…\npm\vue.ps1,因为在此系统上禁止运行脚本。

在 PowerShell 中创建 vue 项目时&#xff0c;出现了以下错误导致创建失败&#xff1a;vue : 无法加载文件 C:\Users\…\npm\vue.ps1&#xff0c;因为在此系统上禁止运行脚本。 报错原因 用户权限不足导致无法加载文件&#xff0c;以管理员身份运行终端或者 PowerShell 也可…

Go异常处理机制panic和recover

recover 使用panic抛出异常后, 将立即停止当前函数的执行并运行所有被defer的函数&#xff0c;然后将panic抛向上一层&#xff0c;直至程序crash。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃&#xff0c;recover只有被defer后才是有意义的。 func main() { p…

Maven安装与配置

目录 一、Maven简介1.1 概述1.2 作用1.3 仓库 二、安装三、配置3.1 配置环境变量3.2 环境变量测试3.3 配置仓库 一、Maven简介 1.1 概述 Maven是一个开源的项目管理工具&#xff0c;用于构建和管理Java项目&#xff0c;基于项目对象模型&#xff08;POM&#xff09;的概念。它…

面试八股文Mysql:(1)事务实现的原理

1. 什么是事务 事务就是一组数据库操作&#xff0c;这些操作是一个atomic&#xff08;原子性的操作&#xff09; &#xff0c;不可分割&#xff0c;要么都执行&#xff0c;要么回滚&#xff08;rollback&#xff09;都不执行。这样就避免了某个操作成功某个操作失败&#xff0…

putty使用记录

在官网下载并安装putty 一、SSH 二、FTP open 192.168.1.118 put -r C:\Users\Administrator\Desktop\test /opt/lanren312/test # 上传&#xff08;文件夹&#xff09; get -r /opt/lanren312/test C:\Users\Administrator\Desktop\test2 # 下载&#xff08;文件夹&#xff…

Android Studio实现图形验证码

源代码 源代码MainActivity 效果图32行需要修改&#xff0c;不修改会报错&#xff1a;需要常量表达式&#xff0c;我的代码已修改 点击后 MainActivity import static com.example.graphicverificationcode.RxCaptcha.TYPE.NUMBER;import android.annotation.SuppressLint; …

获取 Android 的 SHA1 值

1、调试版&#xff0c;可以直接在 Android studio 中的 gradle 中查看。也可以用下面方法进行 前提要先确定签名文件所在的路径&#xff1a;调试版默认使用的签名文件是debug.keystore&#xff0c;文件处于 C 盘用户目录下的.android文件夹下。打开命令行工具&#xff0c; 1、…

Uniapp使用腾讯地图并进行标点创建和设置保姆教程

使用Uniapp内置地图 首先我们需要创建一个uniapp项目 首先我们需要创建一个uniapp项目 我们在HBuilder左上角点击文件新建创建一个项目 然后下面这张图的话就是uniapp创建项目过程当中需要注意的一些点和具体的操作 然后我们创建完项目之后进入到项目pages文件夹下&#xff…

web-csrf

目录 CSRF与XSS的区别&#xff1a; get请求 原理&#xff1a; pikachu为例 post请求 pikachu为例 CSRF与XSS的区别&#xff1a; CSRF是借用户的权限完成攻击&#xff0c;攻击者并没有拿到用户的权限&#xff0c;而XSS是直接盗取到了用户的权限 get请求 原理&#xff1a;…

新法!《个人信息保护合规审计管理办法(征求意见稿)》解读

8月3日&#xff0c;依据《中华人民共和国个人信息保护法》等法律法规&#xff0c;国家互联网信息办公室起草了《个人信息保护合规审计管理办法&#xff08;征求意见稿&#xff09;》&#xff08;下文简称“办法”&#xff09;&#xff0c;并向社会公开征求意见。 据悉&#xff…

交互流程图设计软件都有哪些?

交互流程图是设计行业信息流、观点流或组件流的图形代表。但是市场上应该如何选择各种交互流程图软件呢&#xff1f;如何使用高质量的交互流程图软件来绘制高端氛围的高档流程图&#xff1f;今天&#xff0c;小边给您带来了十个超级实用的交互流程图软件&#xff0c;我希望能帮…

竞赛项目 疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据全国疫情数据分析与3D可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff0…

【位操作符的几种题型】

位操作符的几种题型 目录 题型一&#xff1a;寻找“单身狗”。 题型二&#xff1a;计算一个数在二进制中1的个数 题型三&#xff1a;不允许创建临时变量&#xff0c;交换两个整数的内容 题型一&#xff1a;寻找“单身狗”。 1.1题目解析 在一个整型数组中&#xff0c;只有…