[過去ログ] プログラミングのお題スレ Part21 (1002レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
935
(1): 638 [sage] 2023/07/14(金) 16:41:43.17 ID:9h33JNqm(1/2) AAS
>>927
927(7): 蟻人間 ◆T6xkBnTXz7B0 [sage] 2023/07/13(木) 21:54:33.63 ID:pFytGTyV(1/2) AAS
お題: 入力として32ビット整数のビットマスクが与えられる。
ビットマスクに含まれる有効なビットの組み合わせをブルートフォースせよ。

例)
0x13
→(0x1, 0x2, 0x3, 0x10, 0x11, 0x12, 0x13).
0x45
→(0x1, 0x4, 0x5, 0x40, 0x41, 0x44, 0x45).
0x92C
→???
 Perl5

for (qw(0x13 0x45 0x92C)) {
 $n = eval;
 @a = map{sprintf "0x%x", $_} grep{($_ & $n) == $_} 0..$n;
 print "$_: @a\n";
}

※インデントは全角スペースに置換してあります。

実行結果
$ perl 21_927.pl
0x13: 0x0 0x1 0x2 0x3 0x10 0x11 0x12 0x13
0x45: 0x0 0x1 0x4 0x5 0x40 0x41 0x44 0x45
0x92C: 0x0 0x4 0x8 0xc 0x20 0x24 0x28 0x2c 0x100 0x104 0x108 0x10c 0x120 0x124 0x128 0x12c 0x800 0x804 0x808 0x80c 0x820 0x824 0x828 0x82c 0x900 0x904 0x908 0x90c 0x920 0x924 0x928 0x92c
936: 638 [sage] 2023/07/14(金) 18:16:11.02 ID:9h33JNqm(2/2) AAS
>>935 これだとコード書くの安直で楽だけど、効率悪いんだよね、特に値が大きいとき。
 効率に配慮すると、こうか↓

sub f {
 if (@_) {
  my $b = shift;
  @_ ? map{$_, $_ | 2**$b} f(@_) : ($_, $_ | 2**$b);
 }
}
for (qw(0x13 0x45 0x92C)) {
 $n = eval;
 @b = grep{$n & 2**$_} 0..31;
 @s = map{sprintf "0x%x", $_} f(@b);
 print "$_: @s\n";
}

※インデントは全角スペースで置換してありま

実行結果:
$ perl 21_927_effective_bit_mask.pl
0x13: 0x0 0x1 0x2 0x3 0x10 0x11 0x12 0x13
0x45: 0x0 0x1 0x4 0x5 0x40 0x41 0x44 0x45
0x92C: 0x0 0x4 0x8 0xc 0x20 0x24 0x28 0x2c 0x100 0x104 0x108 0x10c 0x120 0x124 0x128 0x12c 0x800 0x804 0x808 0x80c 0x820 0x824 0x828 0x82c 0x900 0x904 0x908 0x90c 0x920 0x924 0x928 0x92c
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 1.815s*