50301


コメント部の部分なのですがビットシフトを使って各RGBAのビットを取り出して各変数に入れていると思われるのですがこの数字はどのような意味なのでしょうか？1バイト(8ビット)
8の値で動いてると思うのですが、それと0xff(8)と&することをなぜするのか教えてくれますでしょうか？  
内部的な意味が知りたいです。

[code]

    using System;
    using System.Windows.Forms;
    using System.Drawing;
    
    class CodeFile1 : Form
    {
        //private Image im;
        //private RadioButton rb1, rb2, rb3;
        //private GroupBox gb; 
        private Bitmap bm1, bm2;
        private int i;
    
        /*Main関数*/
        private static void Main()
        {
            Application.Run(new CodeFile1());
        }
    
        public CodeFile1()//コンストラクタ
        {
            this.Text = "サンプル";
            this.Width = 300;
            this.Height = 200;
    
            bm1 = new Bitmap("c:\\tea.jpg");
            bm2 = new Bitmap("c:\\tea.jpg");
            i = 0;
            this.Click += new EventHandler(fm_Click);
            this.Paint += new PaintEventHandler(fm_Paint);
        }
    
        public void convert()
        {
            for(int x = 0; x < bm1.Width; x++)
            {
                for(int y = 0; y < bm1.Height; y++)
                {
                    Color c = bm1.GetPixel(x,y);
                    int rgb = c.ToArgb();
                    int a = (rgb >> 24) & 0xFF;//ここです以下4行
                    int r = (rgb >> 16) & 0xFF;
                    int g = (rgb >>  8) & 0xFF;
                    int b = (rgb >>  0) & 0xFF;
                    switch(i)
                    {
                        case 1:
                            r >>= 2; break;
    
                        case 2:
                            g >>= 2; break;
    
                        case 3:
                            b >>= 2; break;
                    }
                    rgb = (a << 24) | (r << 16) | (g << 8) | (b << 0);
                    c = Color.FromArgb(rgb);
                    bm2.SetPixel(x,y,c);
                }
            }
        }
    
        public void fm_Click(object seder,EventArgs e)
        {
            i++;
            if(i >= 4)
            {
                i = 0;
            }
            convert();
            this.Invalidate();
    
        }
    
        public void fm_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawImage(bm2,0,0,400,300);
        }
    }
    
[/code]


CC BY-SA 4.0
2018-11-13T13:47:11.503
50297
2018-12-07T16:15:17.903
2018-12-07T16:15:17.903
76
question
c#
windowsアプリ、RGBの色を取り出す時のbitシフトの数字の意味が知りたい。


`int
rbg`が１バイト=8bitではなく、今時のCPU/OSは64bitなり、32bitアーキテクチャなので、１バイトとしているものが`Int32`または`Int64`の型になります。  
そこで、32bitが１バイトであるときに、下に上がビット番目、下がcの中の値が、`r`,`g`,`b`,`a`のどの値を示すかを表にしてみました。

[code]

        |33222222222211111111110000000000|
     bit|10987654321098765432109876543210|
    ----+--------------------------------+
     val|aaaaaaaarrrrrrrrggggggggbbbbbbbb|<- cの中身の意味的ビット表現
    
[/code]

値が１バイト(32bit)にまとまっているので

[code]

    0xff|00000000000000000000000011111111|
    
[/code]

と、ビットアンドを取ることで、そのままだと、`bbbbbbbb`の値が取得されます  
同様に、`gggggggg`を切り出して別の変数に格納するには、

  * `0xff00`(=`1111111100000000`)とビットアンドを取って８ビット右にシフトする
  * 普通の数学と同じで分配則と交換則を使って、両方の数字を８ビット右にシフトしてからビットアンドを取る

の、２つの方法があり、後者を式にすると、`(c >> 8) & 0xff`になりますよね？  
これで、質問に示された、`c`から`g`成分を抽出したことになるのはご理解いただけると思います

あとは、シフトする数字を8bitずつ増やしていくことで、`b`, `r`, `a`の値も取得出来るのはご理解いただけると思います。


CC BY-SA 4.0
2018-11-13T17:30:59.250
50301
2018-11-14T11:22:34.107
2018-11-14T11:22:34.107
14745
14745
50297
answer