相关疑难解决方法(0)

我可以在C或C++中使用二进制文字吗?

我需要使用二进制数.

我试着写:

const x = 00010000;
Run Code Online (Sandbox Code Playgroud)

但它没有用.

我知道我可以使用具有相同值的十六进制数字00010000,但我想知道C++中是否存在二进制数的类型,如果没有,是否有另一种解决方案可以解决我的问题?

c c++ binary

182
推荐指数
13
解决办法
34万
查看次数

定义常量时包括算术运算

所以我经常看到这样的事情:

#define gf_PI  f32(3.14159265358979323846264338327950288419716939937510)
#define gf_PIhalf  f32(3.14159265358979323846264338327950288419716939937510 * 0.5)
Run Code Online (Sandbox Code Playgroud)

这意味着每次在我的代码中使用gf_PIhalf时计算一半PI值,对吧?
相反,字面上写下一半PI的值不是更好吗?

做以下事情不是更好吗?

#define gf_PI f32(3.14159265358979323846264338327950288419716939937510)
const float gf_PIHalf = gf_PI * 0.5f;    // PIHalf is calculated once
Run Code Online (Sandbox Code Playgroud)

最后这样做是不是最好(为什么它似乎不是一种常见做法):

const float gf_PI = 3.14159265358979323846264338327950288419716939937510;
const float gf_PIHalf = gf_PI * 0.5f;
Run Code Online (Sandbox Code Playgroud)

c++ constants c-preprocessor

9
推荐指数
1
解决办法
1469
查看次数

Clang真的很聪明吗?

如果我使用Clang 3.3编译以下代码,-O3 -fno-vectorize即使删除了注释行,也会得到相同的汇编输出.代码类型将所有可能的32位整数置于浮点数并计算[0,1]范围内的值.Clang的优化器实际上是否足够聪明,以致当被处理为浮点数时0xFFFFFFFF不在[0,1]的范围内,所以忽略fn完全的第二次调用?删除第二个调用时,GCC会生成不同的代码.

#include <limits>
#include <cstring>
#include <cstdint>

template <class TO, class FROM>
inline TO punning_cast(const FROM &input)
{
    TO out;
    std::memcpy(&out, &input, sizeof(TO));
    return out;
}

int main()
{
    uint32_t count = 0;

    auto fn = [&count] (uint32_t x) {
        float f = punning_cast<float>(x);
        if (f >= 0.0f && f <= 1.0f)
            count++;
    };

    for(uint32_t i = 0; i < std::numeric_limits<uint32_t>::max(); ++i)
    {
        fn(i);
    }
    fn(std::numeric_limits<uint32_t>::max()); //removing this changes nothing

    return count;
}
Run Code Online (Sandbox Code Playgroud)

见这里: …

c++ llvm clang compiler-optimization c++11

8
推荐指数
1
解决办法
614
查看次数

如何将此错误静音:"整数文字太大而无法以有符号整数类型表示"

我在C中有这个学校作业,我将用以下标志更正:

-Wall -Wextra -Werror
Run Code Online (Sandbox Code Playgroud)

因此,这种无害的警告会成为错误并阻止编译:

integer literal is too large to be represented in a signed integer type
Run Code Online (Sandbox Code Playgroud)

(代码仍然有效)但如果我不能将其静音,我的工作将被视为错误

这是我的代码:

static unsigned long long   piece_to_map(unsigned short little)
{
    static unsigned short   row;
    unsigned long long      big;
    char                    i;
    unsigned long long      mask_left;
    unsigned long long      mask_top;

    mask_left = 9259542123273814144;
    mask_top = 18374686479671623680;
    row = 15;
    big = 0;
    i = 0;
    while (i < 16)
    {
        big |= (little & (row << i)) << i;
        i += 4;
    }
    while …
Run Code Online (Sandbox Code Playgroud)

c binary

5
推荐指数
2
解决办法
4070
查看次数

如何使用C语言在变量中存储一系列位

如何使用C语言将这一系列 "000001111110001"(15 )存储在变量中.

我试图将它存储到unsigned int:

unsigned int key=000001111110001;
Run Code Online (Sandbox Code Playgroud)

但它没有,所以请帮助我.

c

3
推荐指数
1
解决办法
266
查看次数

有没有一种有效的方法来构建b10101010101010101010101010101010?

我想构造二进制字符串10101010101010101010101010101010(即16 1和16 0)表示的无符号整数(4个字节).

是否有一种使用位操作构造此值的有效方法?我可以在for循环中完成它,但我觉得效率低下.

任何语言都适合我.我个人认识c和C++.

bit-manipulation

-1
推荐指数
1
解决办法
383
查看次数

C++动态分配

我对以下说明非常困惑:

#include <iostream>
#define MAX_IT 100
using namespace std;

class Integer{

private :
    int a;
public:
    Integer(int valoare){a=valoare;}
    int getA(){return a;}
    void setA(int valoare){a=valoare;}
};

int main(){
    Integer* a=new Integer(0);

    //cout<<a[0].getA();
    for(int i=1;i<=MAX_IT;i++)
    {
        a[i]=*(new Integer(i));
    }

    for(int i=0;i<=MAX_IT;i++)
        cout<<a[i].getA()<<endl;

    return 13;
}
Run Code Online (Sandbox Code Playgroud)

它适用于MAX_IT的小值,但是当我尝试将MAX_IT设置为1000时,它不再起作用.最初,我认为"新"操作员应该完成这项工作,但经过一些阅读文档后,我明白它不应该像这样(超出数组)工作.

所以我的问题是:为什么它适用于MAX_IT的小值而不适用于较大的值?

编辑:

我正在尝试使用此代码来处理更大的程序,我不允许使用STL.你还没有理解我的顾虑:如果我有Integer*var = new Integer [10]; for(int k = 1; K <10; k ++)*(var + k)= k; //这很好,但如果我尝试var [10] = new Integer; //这应该不起作用,应该会产生内存问题//我担心的是,如果我只做了100次左右它就能正常工作......这个问题为什么每次迭代次数都很少?

c++ arrays dynamic

-2
推荐指数
1
解决办法
217
查看次数