V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sinksky
V2EX  ›  C

C++这个位运算是不是被优化掉了?

  •  
  •   Sinksky · 2019-04-19 23:11:33 +08:00 · 2751 次点击
    这是一个创建于 2063 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #include<bits/stdc++.h>
    using namespace std;
    #define uc unsigned char
    char cal(char c,int k){
    	return (c>>(7-k))&1;
    }
    void print(char c){
    	for(int i = 0;i < 8;++i)
    		cout << (int)(cal(c,i));
    }
    int main(void){
    	uc a = 'c';
    	cout << "a 二进制表示: ";print(a);cout << endl;
    	uc b = (a<<2)>>2;
    	cout << "b 二进制表示: ";print(b);cout << endl;
    	uc c = a<<2;
    	cout << "c 二进制表示: ";print(c);cout << endl;
    	uc d = c>>2;
    	cout << "d 二进制表示: ";print(d);cout << endl;
    	return 0;
    } 
    
    

    输出结果

    a 二进制表示: 01100011
    b 二进制表示: 01100011
    c 二进制表示: 10001100
    d 二进制表示: 00100011
    

    在 b 的定义中左移右移写一起,因为逻辑右移,前面应该补 0 然而没有.
    分开写就行了
    编译器 TDM-GCC 4.9.2 64-bit Release
    怎么取消它的优化呢?-O0 好像也不行.
    遇到这种位运算写一起的情况不知道咋办了.

    6 条回复    2019-04-20 19:40:50 +08:00
    exch4nge
        1
    exch4nge  
       2019-04-20 00:46:55 +08:00 via iPhone   ❤️ 1
    试试这个 ((uc)(a<<2))>>2
    Bromine0x23
        2
    Bromine0x23  
       2019-04-20 01:01:53 +08:00   ❤️ 1
    (a << 2) >> 2 的结果类型是 int,并不需要补 0
    soli
        3
    soli  
       2019-04-20 01:16:12 +08:00   ❤️ 3
    这应该是『整型提升』。
    zealot0630
        4
    zealot0630  
       2019-04-20 09:29:00 +08:00 via Android
    尽量用 auto,非必要时不用指定类型,能少踩类似坑
    smdbh
        5
    smdbh  
       2019-04-20 15:46:39 +08:00
    @exch4nge
    uc b = (uc)(a<<2)>>2;
    Sinksky
        6
    Sinksky  
    OP
       2019-04-20 19:40:50 +08:00
    是运算过程中进行了整型提升.
    1L 的语句是有效的,已尝试,因为在进行第二次操作之前进行了转型.
    cout << typeid(a<<2).name() << endl;
    运行此语句可得到 a<<2(a 为无符号字符类型)是 int 类型.
    谢谢各位 dalao 的帮助. :)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1240 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:55 · PVG 07:55 · LAX 15:55 · JFK 18:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.