控制硬件時(shí)别垮,常涉及打開(kāi)/關(guān)閉特定的位或查看他們的狀態(tài)便监,一般都會(huì)使用到按位運(yùn)算符技術(shù)。
一個(gè)面試題:
int a = 1, b = 32;
print("%d, %d", a<<b, 1<<32);
答案是 1碳想,0
為什么a << b 的結(jié)果是1烧董? 運(yùn)行時(shí)會(huì)將操作數(shù)b對(duì)32取模,然后在進(jìn)行移位操作胧奔。
為什么1 << 32 的結(jié)果是0解藻?只有在運(yùn)行時(shí)才會(huì)進(jìn)行按位運(yùn)算操作數(shù)取模優(yōu)化,而常量表達(dá)式是在編譯之時(shí)由編譯器計(jì)算出結(jié)果葡盗。
但這個(gè)取模的優(yōu)化操作網(wǎng)上也沒(méi)有找到資料詳細(xì)介紹螟左,便自己測(cè)試了一下,
1. 如果是int類(lèi)型觅够,移動(dòng)的位數(shù)超過(guò)32時(shí)會(huì)對(duì)32取模胶背。
2. 取模的數(shù)固定為32, 不會(huì)因?yàn)楸毁x值數(shù)的數(shù)據(jù)類(lèi)型而改變。
int a = 1;
int b = 17;
short int res1 = a << b;
short int res2 = 1 << 16;
std::cout << res1 << std::endl;? ? //???res1 = 0? ? 只會(huì)對(duì)32取模喘先,而不會(huì)對(duì)short int的大星鳌(16)取模
std::cout << res2 << std::endl;? ? ?//? res2 = 0