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

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);
    }
}