V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Sinksky
V2EX  ›  C

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

  •  
  •   Sinksky · Apr 19, 2019 · 3235 views
    This topic created in 2565 days ago, the information mentioned may be changed or developed.
    #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 replies    2019-04-20 19:40:50 +08:00
    exch4nge
        1
    exch4nge  
       Apr 20, 2019 via iPhone   ❤️ 1
    试试这个 ((uc)(a<<2))>>2
    Bromine0x23
        2
    Bromine0x23  
       Apr 20, 2019   ❤️ 1
    (a << 2) >> 2 的结果类型是 int,并不需要补 0
    soli
        3
    soli  
       Apr 20, 2019   ❤️ 3
    这应该是『整型提升』。
    zealot0630
        4
    zealot0630  
       Apr 20, 2019 via Android
    尽量用 auto,非必要时不用指定类型,能少踩类似坑
    smdbh
        5
    smdbh  
       Apr 20, 2019
    @exch4nge
    uc b = (uc)(a<<2)>>2;
    Sinksky
        6
    Sinksky  
    OP
       Apr 20, 2019
    是运算过程中进行了整型提升.
    1L 的语句是有效的,已尝试,因为在进行第二次操作之前进行了转型.
    cout << typeid(a<<2).name() << endl;
    运行此语句可得到 a<<2(a 为无符号字符类型)是 int 类型.
    谢谢各位 dalao 的帮助. :)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2758 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 15:42 · PVG 23:42 · LAX 08:42 · JFK 11:42
    ♥ Do have faith in what you're doing.