プログラミング得意な奴ちょっと来い

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
ビットの並び逆にして乗算すれば除算なしでいけるかも

コメント

タイトルとURLをコピーしました