我有以下整数文字:
let centre: u64 = 0b00000000_00000000_00111100_00111100_00111100_00111100_00000000_00000000;
它代表了一个国际象棋棋盘,所以我认为格式化它会更好:
let centre: u64 = 0b
00000000
00000000
00111100
00111100
00111100
00111100
00000000
00000000;
但是,上面的例子没有编译,因为新行被解释为我的文字中的空格。有没有办法实现这个目标?
答案 0 :(得分:5)
使用标准库中的宏(从Rust 1.22开始),无法将标记连接到新标记(就像在C预处理器中使用##
一样)。
然而,我想出了以下宏。它在每一行重复0b_
,但至少你可以清楚地看到零和一的模式。在编译时评估移位和OR,因此与普通文字相比,此解决方案没有运行时损失。
macro_rules! chessboard {
($line0:tt $line1:tt $line2:tt $line3:tt $line4:tt $line5:tt $line6:tt $line7:tt) => {
($line0 << 56) |
($line1 << 48) |
($line2 << 40) |
($line3 << 32) |
($line4 << 24) |
($line5 << 16) |
($line6 << 8) |
($line7 << 0)
}
}
fn main() {
let centre: u64 = chessboard!(
0b_00000000
0b_00000000
0b_00111100
0b_00111100
0b_00111100
0b_00111100
0b_00000000
0b_00000000);
println!("{:#b}", centre);
}