74hc595的问题dat右移动七位

下面这个程序为什么dat需要右移七位?,595不是高位先输入到Q7吗?为什么要写个低输入的程序

#include "reg51.h"
#include<intrins.h>

typedef unsigned int u16;
typedef unsigned char u8;

sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;

u8 ledduan[]={0x38,0x44,0x42,0x21,0x42,0x44,0x38,0x00};
u8 ledwei[]={0x7f
,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

void delay(u16 i)
{
while(i--);
}

void Hc595SendByte(u8 dat)
{
u8 a;
SRCLK=0;
RCLK=0;
for(a=0;a<8;a++)
{
SER=dat>>7;
dat<<=1;

    SRCLK=1;
    _nop_();
    _nop_();
    SRCLK=0;    
}


RCLK=1;
_nop_();
_nop_();
RCLK=0;

}

void main()
{
u8 i;
while(1)
{
P0=0x7f;
for(i=0;i<8;i++)
{
P0=ledwei[i]; //位选
Hc595SendByte(ledduan[i]); //发送段选数据
delay(100); //延时
Hc595SendByte(0x00); //消隐
}
}
}

SER=dat>>7; 不就是 SER=dat的最高位了吗。
比如 10000000 右移七位就是1;
dat<<=1;就是让次高位成为最高位通过SER=dat>>7全部传输