【问题标题】:Bitwise Flags abandoned? [closed]按位标志被放弃了? [关闭]
【发布时间】:2010-09-18 11:54:43
【问题描述】:

我注意到许多开源项目不再使用 BITWISE 标志,即使它完全被 web 通用编程环境 (php/Mysql) 支持。 对于一些有效的问题,这是一种“丢失的做法”,还是只是很多 php 程序员不知道如何处理这种类型的实现?

没什么太重要的,只是很好奇:) 谢谢大家

【问题讨论】:

    标签: php mysql open-source


    【解决方案1】:

    我会直截了当地说,每个技术职位都需要对位运算有充分的了解。

    我有一则轶事间接解决了这个话题。

    2007 年 1 月,我在印度科钦招聘长期开发人员。由于我没有参与候选人的初步筛选,所以我不知道应该期待什么标准,所以我准备了一系列问题和主题,从对二进制和十六进制的简单理解到架构、设计和项目管理。

    当我与印度人力资源部的人讨论我的方法时,我(温和地)因为投球太低而受到责备。他明确表示,我关于 hex 的问题可能会被视为对候选人经验或教育的侮辱。

    但是,我在英国面试数百名候选人的经历让我坚信,不可能把调得太低。我的观点过去和现在仍然是,如果候选人很合格,那么调整讨论水平就很简单了。我从来没有人表达过被侮辱的感觉,相反,我认为一个合格的候选人可能会在面试的飞速开始时感到如释重负。它还有助于打破僵局并建立有意义的采访所需的融洽关系。另一方面,不合格的候选人通常会遇到这些较低的障碍。

    但不想完全忽视当地的建议,我谨慎地决定将我的基本采访主题包括在内,并准备好在它们不起作用时放弃它们。

    随着面试的进展,我很高兴我从那个级别开始。它没有冒犯任何人,不合适的候选人很容易被识别出来。

    这并不是说我希望应聘者每天都在处理一些琐碎的事情,但无论是哪种语言,对编程基础知识的充分理解都是必不可少的。即使是更高抽象级别的开发人员也会定期接触十六进制(例如 RGB 值)。鹦鹉学舌 stuff you find on the net 只会在第一次完美运行的情况下有所帮助。

    但对于在过去五年中起步的开发人员来说,我认为掩饰基础知识太容易了,因为它们受到善意的 IDE 和“无代码”编程的迷因的宠爱。 Visual Studio 安装闪屏吹嘘无需编写代码即可进行开发。确实,does Visual Studio rot the mind

    【讨论】:

    • 一个有趣的轶事,但我看不出这是如何回答问题的。
    【解决方案2】:

    如今,许多程序员似乎只是脑子里装满了足够的知识来暴力破解代码,然后在没有被教导过“按位”之类的词是什么意思的情况下被送入工作岗位。

    我告诉你,这是一门垂死的艺术......

    【讨论】:

    • 我没有看到连贯的理由。是的,这是一项相关性/流行度越来越低的技能,但这并不能回答问题。
    【解决方案3】:

    按位运算不仅仅是为了节省内存。它们对于编写清晰的代码非常有用。你更想看哪个?

    OpenFile("...", true, false)
    

    OpenFile("...", writeonly | append)
    

    这是一个荒谬/琐碎的例子,但你明白了。

    【讨论】:

    • 我宁愿看到第一个,带有代码文档弹出窗口。第二个似乎更模棱两可。
    • 有了第二种,不需要记住选项的顺序,也没有增加函数必须支持的参数个数,调用是自记录的。
    【解决方案4】:

    如果您有一个已经很复杂的应用程序,为什么还要使用按位标志使其更复杂。如果没有更多的好处,我个人不会使用这种标志,然后只是很酷。而且凭经验,写起来还是挺容易的,以后调整就更难了,更别说自己没写了。

    哦,为了记录,我确实知道如何使用它们。

    【讨论】:

    • 我同意,它们只是更难,当内存很昂贵时,它们是有意义的。现在内存很便宜,带宽更快没有意义。
    • 仍然每个开发人员都应该知道什么是按位标志,以防他不得不处理它们(即遗留代码或硬件通信)。看来很多开发者真的很怀念它。
    • 是的,我完全同意这一点,但是因为某人没有使用特定技术并不一定意味着他不知道或不知道它。
    【解决方案5】:

    在内存管理至关重要的嵌入式编程之外,它们的成本超过了它们的最低价值。特别是,查询包含按位标志的 db 列会产生神秘的 SQL,它需要引用应用程序的代码来确定每个按位操作引用的值。

    WHERE (ISNULL(flags, 0) & 4096 = 0 -- What does this bit refer to? 
    

    如果必须以这种方式查询您的数据库不会吓到您,那就应该这样做。

    【讨论】:

    • 确实,这些值对逆向工程来说是个麻烦事。在 apache configs 中看到 php 错误报告值时,我遇到了这个问题!
    • 这一段 SQL 似曾相识……
    • 哈!嘿,杰西 - 你看到了这个小世界!
    【解决方案6】:

    如果您对内存和速度有非常严格的要求,或者在进行低级硬件编程时,位域非常有用。

    除非您正在做嵌入式编程或类似的事情,否则您不需要它们。执行相同任务的机制更易读、更强大、更可扩展。例如,Java 的 EnumSets。

    我希望优秀的程序员了解它们而不是使用它们:-p

    【讨论】:

      【解决方案7】:

      “Plenty”很笼统,我们想要名字! ;-)

      说真的,我来自汇编语言和 C 语言,并且非常精通按位运算。 但我不会用它们来替换,比如说一个类中的 10 个不相关的布尔值,而二进制标志是一个整数...... 除非,也许,我有这个类的数百万个实例!

      如果我必须处理大量布尔实例,我会使用一些 bitset 类来优化和抽象这些位数组。

      现在,位操作 fu 在编程中几乎是强制性的,如果你想访问 RGB[A] 值的组件,如果你想调用一些 API(即使这只是 ORing 多个命名标志)等等。

      简而言之,我不会在我做的每个项目中都使用它,但你不能忽略如何去做(有点像正则表达式......)。

      【讨论】:

        【解决方案8】:

        我仍然使用按位运算符,尽管由于我选择的主要语言(和专业)是 C#,我经常使用 Flag 枚举 :) 但是,是的,我认为很多编写 PHP 之类的代码的人都是自学成才的,而且不知道按位运算或它们的用法。

        自学成才,在开始编写 C 和 C++ 代码之前,我对它们了解不多。现在我在有意义的地方使用它们:)

        【讨论】:

        • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
        • @IlijaDimov 无意冒犯,但这个答案是近 7 年前写的,当时堆栈溢出的情况有些不同。您留下的评论不是必需的。
        • 这个答案几天前出现在低质量帖子审核队列中。我根据当前的好答案规则将其标记为不是答案,并且评论自动出现。
        【解决方案9】:

        它们总是有一个地方可以在很小的空间中存储大量布尔标志;

        想想如果你有 32 个标志(例如);您可以将它们全部存储在一个“长整数”中并且只使用 4 个字节,现在假设您选择为每个标志使用 long(只是因为代码更易于维护 - 您现在有 128 个字节要处理。

        我的背景主要是 C/C++,所以我从小就学习它们,所以我肯定会在我使用的每种语言中使用它们;但我同意;新手程序员往往甚至都不在乎 - 所有这些内存都在周围 - 谁在乎?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-22
          • 2016-11-03
          • 1970-01-01
          • 1970-01-01
          • 2018-10-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-22
          相关资源
          最近更新 更多