Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        2年前关闭。
                                                                                            
                
        
我正在编写一个位集成员资格谓词,该谓词应处理x的所有值:

int Contains(unsigned int A, int x)
{
    return (x >= 0) && (x < 8 * sizeof A) && (((1u << x) & A) != 0);
}


是否有更有效的实施方式?

最佳答案

如果x是未签名的,则可以跳过下限检查。

从N1570起:


  6.3.1.3有符号和无符号整数
  
  
  将具有整数类型的值转换为_Bool以外的其他整数类型时,如果
  该值可以用新类型表示,但不变。
  否则,如果新类型是无符号的,则通过重复加或
  比新类型可以表示的最大值多减去一个
  直到该值在新类型的范围内。 60)
  


unsigned int y = x;  // Wrap around if x is negative
return (y < CHAR_BIT * sizeof A) && (1u << y & A) != 0;


不知道这是否真的带来任何有意义的改进。检查您的编译器输出以确保。

关于c - 位集隶属函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46196752/

10-09 08:46