2014年09月07日

C#でビットのローテートシフト

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その39

■問題 (出題者:ところてん さん)
ローテートシフトを実装してください。
例)
0010 0011 1110 1101
↓右に1ビットローテート
1001 0001 1111 0110
ローテートシフトがある言語がどれ位あるか知りたくなって投稿しました。

たぶん、C#には、ローテートシフトはないと思うので、自分でゴリゴリ書くしかなさそうですね。
int限定ですが、マイナスの時にも正しくシフトするように書いてみました。
そのために、intをむりやりuintにキャストしています。

RotateBitメソッドの第二引数は、シフトする数を指定します。

using System;
using System.Collections.Generic;
using System.Linq;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            unchecked {
                int n = (int)0x8106041d;
                Print(n);
                Print(RotateBit(n, 1));
                Print(RotateBit(n, 2));
                Print(RotateBit(n, 3));
                Print(RotateBit(n, 4));
                Print(RotateBit(n, 5));
                Print(RotateBit(n, 6));
            }
            Console.ReadLine();
        }

        static int RotateBit(int value, short n) {
            return (int)(((uint)value >> n)
                        | ((uint)value << (32 - n)));
        }
        static IEnumerable<int> GetBits(int n) {
            for (uint i = 0x80000000; i != 0; i >>= 1) {
                yield return (n & i) != 0 ? 1 : 0;
            }
        }

        static void Print(int n) {
            GetBits(n)
                .Select((m, i) => ((i % 4) == 3) ? m.ToString() + " " : m.ToString())
                .ForEach(x => Console.Write(x));
            Console.WriteLine();
        }
    }

}



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52381510