Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 有没有办法检查指向指针的bool**指针在没有循环的C中是否包含真值?_Ios_C_Pointers_Optimization - Fatal编程技术网

Ios 有没有办法检查指向指针的bool**指针在没有循环的C中是否包含真值?

Ios 有没有办法检查指向指针的bool**指针在没有循环的C中是否包含真值?,ios,c,pointers,optimization,Ios,C,Pointers,Optimization,我正在尝试优化iOS应用程序,只是想就我遇到的一个问题提供一些建议 我有一个bool**,最多可以容纳1024*1024个元素。每个元素默认为false,但也可以随机更改为true 我想知道是否有一种简化的方法来检查true值是否包含在任何元素中,因为在最坏的情况下,使用两个循环执行此检查需要超过一百万次迭代 我可能完全错了,但我曾考虑将内存转换为int,因为我相信,当false值等于0时,如果所有元素都为false,那么将其转换为int的结果将是0。然而,情况并非如此 我可能需要做的是在切换时

我正在尝试优化iOS应用程序,只是想就我遇到的一个问题提供一些建议

我有一个
bool**
,最多可以容纳1024*1024个元素。每个元素默认为
false
,但也可以随机更改为
true

我想知道是否有一种简化的方法来检查
true
值是否包含在任何元素中,因为在最坏的情况下,使用两个循环执行此检查需要超过一百万次迭代

我可能完全错了,但我曾考虑将内存转换为int,因为我相信,当
false
值等于0时,如果所有元素都为false,那么将其转换为int的结果将是0。然而,情况并非如此

我可能需要做的是在切换时记录真实值的数量,但这很快就会变得非常混乱

我希望在没有代码的情况下我已经足够清楚了,但是,如果您需要查看任何代码,请询问

--编辑-- 所以我决定接受mvp的答案。然后,当我需要检查是否设置了某个位时:

uint32_t mask32_t[] = {
    0x01, 0x02, 0x04, 0x08,
    0x10, 0x20, 0x40, 0x80,
    0x100, 0x200, 0x400, 0x800,
    0x1000, 0x2000, 0x4000, 0x8000,
    0x10000, 0x20000, 0x40000, 0x80000,
    0x100000, 0x200000, 0x400000, 0x800000,
    0x1000000, 0x2000000, 0x4000000, 0x8000000,
    0x10000000, 0x20000000, 0x40000000, 0x80000000
};

bool bitIsSet(uint32_t word, int n) {
    return ( word & mask32_t[ n ] ) != 0x00;
}

bool isSetAtPoint( uint32_t** arr, int x, int y ) {
    return bitIsSet( arr[ (int)floor(x / 32.0) ] [ y ], x % 32 );
}

基本上,答案是否定的。你需要写一个循环来检查

不能将复合值强制转换为
int
。您没有报告编译器错误,因此我怀疑您实际上尝试将指向数组的指针强制转换为
int
,这是合法的;但是,如果指针为
NULL
(即不指向任何对象),则结果将仅为0


您可以通过使用位向量而不是布尔数组来简化检查代码。(您还可以节省相当多的内存。)然而,这涉及到更多的代码,而且相当混乱。如果你使用C++,你就可以访问<代码> STD::BITSET ,这比编写自己的程序要简单得多,但它的缺点是需要编译时的大小。

< p>可能最好的优化是将你的1024x1024数组转换成一个数组。这种方法有一些优点和缺点:

  • +
    位数组将消耗8倍的内存:1024*1024/8=128KB
  • +
    通过快速检查32位整数,您可以一次快速测试多个位。换句话说,找到第一个非零位的速度可以是原来的32倍
  • -
    您需要创建自定义例程来读取和写入此数组中的位。然而,这是一项相当简单的任务——只是有点无聊:)

  • 这里已经说过使用整数数组,这可能是最好的选择,但这里有另一种方法

    如果与
    false
    节点相比
    true
    节点的数量非常少,则可以将问题颠倒过来:存储
    true
    -节点的坐标


    我正在考虑一个hashset或BST,您可以使用
    true
    节点的位置作为键。那么检查
    true
    的存在性就很简单了:检查您的数据结构中是否存储了坐标。

    您是否需要知道是否有一个元素是true,而没有其他元素?你需要知道哪个元素是真的吗?我的第一个想法是计算有多少元素是真的。这个模拟器是不是很偶然?如果是,有更好的方法来解决这个问题riddle@Monkey-只需要知道是否有,而不是没有,是真的。哪个元素没有意义。@mvp-不,不是那个,但读起来很有趣:)这个方法看起来很有希望,但是元素的数量不会总是8的倍数,例如,它可能是520*700。这会引起你能想到的问题吗?我知道那些32位整数需要(最终)降到单个位,但除此之外,你能想到的任何可预见的问题?@TomHaz只是向上舍入到最接近的可能大小,忽略不需要的额外位。正如@user694733所说,对齐32位边界以使其更易于计数,比较和复制位-内存损失可以忽略不计。如果您的位数组非常稀疏,则将其作为一个整体进行压缩或单独压缩较小的子部分以获得更好的粒度可能会更有效。这将使访问方法复杂化,但可能使整个结构保持在几KB的RAM中成为可能。