下面这句语法看得痛苦,求!关于移位解决办法

下面这句语法看得痛苦,急求!!!关于移位
#define BASE 0xE000E100
*(volatile UINT32 *)( BASE + ((Num >> 5) << 2)) = 1 << (Num) & 0x1F);


------解决方案--------------------
什么东东。
BASE + ((Num >> 5) << 2)内存地址。
1 << (Num) & 0x1F)值。
*(volatile UINT32 *)( BASE + ((Num >> 5) << 2)) = 1 << (Num) & 0x1F);//指定的内存地址赋值,操作类型为UINT32。

------解决方案--------------------
*(volatile UINT32 *)( BASE + ((Num >> 5) << 2)) = 1 << (Num) & 0x1F;
//分号前多了一个)
//在地址‘0xE000E100+Num整除8’处填写‘2的(Num%32)次方’对应的无符号32位整数。
//不保证对。
 
 

------解决方案--------------------
括号配对吗?
------解决方案--------------------
在地址‘0xE000E100+Num整除32再乘4’处填写‘2的(Num%32)次方’对应的无符号32位整数。

------解决方案--------------------
探讨
#define BASE 0xE000E100
*(volatile UINT32 *)( BASE + ((Num >> 5) << 2)) = 1 << (Num) & 0x1F);

------解决方案--------------------
因为<<优先级比&高
所以上面我的答案纠正为:
在地址‘0xE000E100+Num整除32再乘4’处填写‘(2的Num次方)除以32的余数’对应的无符号32位整数。