- 1 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:14:50.913 ID:KxyZ7gyrd
- アセンブリでビット列を右寄せするにはどうしたらいい?
- 2 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:17:35.009 ID:jHH0bny30
- わかんないけどCtrl + Shift + R
- 3 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:18:59.686 ID:HEhea1cZp
- >> 任意の数
- 4 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:20:00.438 ID:GgFplvU90
- ビット列を右寄せって ビット操作?(´・ω・`)
C言語でビット操作書いて ディスアセンブリ すればいいんじゃない?(´・ω・`)
- 5 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:20:39.899 ID:S0CPSpdj0
- アセンブリ言語だとCPU依存なので何とも言えないけど、
一般的にはビットシフト命令があるからそれを使う - 6 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:21:27.227 ID:GgFplvU90
- ぶっちゃけいうと アセンブリ によって書き方全然違う(´・ω・`)
だから C言語操作を ディスアセンブラ とかで変換したほうがすぐにわかると思う(´・ω・`)
- 7 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:22:21.377 ID:6WuZ5OgTd
- 講義の課題は自力でやろう
- 8 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:22:25.695 ID:D2352AQm0
- Windowsキー+anal
- 9 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:23:05.513 ID:DY9stCGgd
- すまん聞き方が悪かった
C言語でもいいんだが、要は加算とかシフト演算とかアセンブリで使うような演算使ってビット列を右寄せして欲しい
ループとか除算とかコスト掛かりそうな演算はなるべく避ける方向で - 10 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:23:07.667 ID:GgFplvU90
- MIPSとかの講義かな?(´・ω・`)
- 11 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:23:27.608 ID:DY9stCGgd
- 講義ではない
勝手に思った - 12 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:24:47.771 ID:GgFplvU90
- >>11
c言語 ビット演算で検索(´・ω・`) - 13 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:25:14.151 ID:1fXWIQpq0
- 右寄せの意味がわからない
- 15 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:26:31.258 ID:ehokODvKd
- >>13
1010→0011 - 16 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:26:41.388 ID:DY9stCGgd
- >>13
0100101111000000なら
0000000100101111だな - 19 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:28:56.524 ID:GgFplvU90
- >>16
なんで0を消したいんだ?(´・ω・`) - 17 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:26:59.467 ID:GgFplvU90
- >>13
ビットリバーサル とか FFTとか自作でもやってるんかな?(´・ω・`) - 14 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:26:23.670 ID:dV/GdsKS0
- コードなしで質問するやつってセンスないよね
- 20 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:29:43.693 ID:M+9WD5j80
- え、ビットシフトのことなの?
- 21 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:30:26.055 ID:deU7V8ot0
- 板違い
- 24 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:32:25.865 ID:1TB2i5qG0
- 下位に0が並ぶ数だけビットシフトしたい、ってことでいいの?
- 25 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:33:16.380 ID:GgFplvU90
- 16進数で下位4ビットの0のときのパターンってどうなんかな(´・ω・`)
0xfe 0xfd 0xfc 0x fb 0x fa ・・・・・
なんか簡単なパターンありそうだな(´・ω・`)
- 26 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:34:36.533 ID:1TB2i5qG0
- 一番下のビットだけ残すのが(-n & n)だから、
n ? n / (-n & n) : 0;
でよくね?
- 30 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:38:24.921 ID:1fXWIQpq0
- >>26
これが一番コスト低そう - 27 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:36:31.323 ID:3hOr87EPa
- 除算使えばできるけど、そもそも除算自体がコストかなり高いぞ
- 29 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:37:27.569 ID:1I33lhl40
- 最近のx86ならpopcountして、1をpopcount分左シフトして1引けばいい
popcountも分岐なしでできるアルゴリズムあるはずだから命令なくてもまぁいける - 31 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:41:05.333 ID:1I33lhl40
- もし__popcount関数でビット数をカウントできるとするなら、
int count = __popcount(x);
int ans = (1 << count) -1;
みたいなノリで行けると思う - 32 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:43:02.139 ID:S0CPSpdj0
- 俺のオリジナルじゃないけど、2の補数をうまく使った超絶技巧
uint32_t hoge( uint32_t val)
{
return val >> (( val & -val) – 1);
} - 33 名前:ひみつの名無しさん 投稿日時:2020/07/25(土) 14:43:03.295 ID:3hOr87EPa
- ビットの並び逆にして乗算すれば除算なしでいけるかも
コメント