こちらのページを参考に一番端の立っているビットの位置を求めるプログラムを実装しています。
参考にしているページはC#ですがRustで書き直しています。
https://ac-as.net/how-to-get-right-most-bit/
実装は上手くいってそうなんですけどある値を境にオーバーフローしてしまいます。
具体的には 1 ~ 6
までの値はオーバーフローせずに正常な値を得ることができます。
7
以降になるとオーバーフローしてしまいます。
どこか実装でミスをしているのか、そもそもアルゴリズムに対する理解が違うのか(6ビット区切りだからそもそも7桁以降は求められないのか?)
その他ネットで色々と情報を探しましたが手掛かりはありませんでした。
何かヒントがあれば教えていただけないでしょうか?
Rust
1fn create_table() -> Vec<usize> { 2 let mut table = vec![0usize; 64]; 3 let mut hash = 0x03F566ED27179461u64; 4 for i in 0..64usize { 5 table[(hash >> 58) as usize] = i; 6 hash <<= 1; 7 } 8 table 9} 10 11fn count_bit(n: u64) -> usize { 12 if n == 0 { 13 return 64; 14 } 15 let y = ((n as i64) & -(n as i64)) as u64; 16 let index = ((y*0x03F566ED27179461u64) >> 58) as u64; 17 let table = create_table(); 18 table[index as usize] 19} 20 21fn main() { 22 for i in 0..=7 { 23 let n = 1u64 << i; 24 println!("{}", count_bit(n)); // Error if i == 7 25 } 26}
エラーログ
Log
10 21 32 43 54 65 76 8thread 'main' panicked at 'attempt to multiply with overflow', src/main.rs:127:18 9note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
追記
なぜかpaizaの実行環境ではエラーにならず63まで正常に表示されました。。。
バージョンによる差異なのでしょうか。。。?
Paiza -> rustc 1.59.0
Local -> rustc 1.62.0


回答1件
あなたの回答
tips
プレビュー