C语言中的"!"是什么?
我遇到以下片段: pt->aa[!!(ts->flags & MASK)] = -val; !!什么(双感叹号/感叹号/两个非操作员)代表C? 不(!!NULL) == NULL? 解决方案 !是否定.因此!!是否定的.重要的是结果将是int. !!x如果x == 0是!!0,那就是!1,那就是0. !!x如果x != 0是!!(!0),那就是!!1,那就是!0,那就是1. !!如果要将任何非零值转换为1,则通常使用 !!,而确定0保留为0. 确实,!!NULL == NULL,因为!!NULL == !!0和!!0 == !1以及最后!1 == 0. 因此,在您引用的简短代码中,如果括号中的表达式为NULL,并且1否则. 其他解决方案 通常(AB)通过重复应用布尔值非操作员,将任何值转换为int s 0或1,!. 例如:!56为0,因为将56视为布尔时56是" true".这意味着!!56为1,因为!0为1. 其他解决
2 2024-04-05
编程技术问答社区
你能用布尔代数法将一个具有不关心条件的布尔表达式最小化吗?
我必须以不关心条件的SOP形式最大程度地减少布尔表达.我可以通过k-map做到这一点,但是我只能使用布尔代数法则才能做到这一点. q. Sigma(0,2,3,5,6,7,8,9) + D(10,11,12,13,14,15) 解决方案 使用布尔法律将给定的明确列表和不关心术语可以转换为一个较短的隐性列表. karnaugh-veitch : 从地图或通过检查给定14个可能的14个可能的术语的检查,很明显,只有两个术语是false:1和2. . 因此,表达式可以写为 !(X0 & !X1 & !X2 & !X3) & !(!X0 & X1 & ! X2 & !X3) 应用(!X0 + X1 + X2 + X3) & (X0 + !X1 + X2 + X3) 这两个因素共享(X2 + X3),因此可以考虑到: (!X0 + X1) & (X0 + X1) + X2 + X3 这导致结果: !X0 & !X1 + X0 & X1
18 2024-04-01
编程技术问答社区
Z3布尔表达简化
试图简化这种布尔表达. (not (and (or (not e) (not f) (not h)) (or (not f) (not h) d) (or (not e) (not h) c) (or (not h) d c) (or (not e) (not f) (not g) a) (or (not f) d (not g) a) (or (not e) (not f) a i) (or (not f) d a i) (or (not e) c (not g) a) (or d c (not g) a) (or (not e) c a i) (or d c a i) (or (not e) (not f) a b) (o
12 2024-04-01
编程技术问答社区
简化布尔表达式(A'BC)+(A'B'C)+(A'BC)+(AB'C)
请帮助我简化这个.我对这些有点陌生. (A'BC') + (A'B'C) + (A'BC) + (AB'C) 我使用的书和答案, Answer = A'B + B'C 我尝试简化,但是我被两个驱动器陷入了困境, 到目前为止,我的简化是这样的... (A'BC') + (A'B'C) + (A'BC) + (AB'C) A (BC' + B'C) + C (A'B + AB') 这似乎不是一种写作方式,请有人帮助我简化这一点, ,请逐步显示,因为我是新的. 我也没有如何进一步简化驱动器. 解决方案 您有规则X' + X = True.所以 (A'BC') + (A'B'C) + (A'BC) + (AB'C) = (A'BC') + (A'BC) + (A'B'C) + (AB'C) = // just permuting the terms A'B(C' + C) + (A' + A)B'C = //
22 2024-04-01
编程技术问答社区
在Python中评估布尔型元组
我试图让它评估为false. (False,) 目前等于true,因为我认为元组不是空的. 那么,如何提取或将其提取给布尔值呢? 谢谢〜 解决方案 从元组中提取元素是最简单的方法: value = (False,)[0] python2更宽容,但总的来说,将元组视为比较目的的单个值并不是一个好习惯(Python3明确禁止它) 而是看 all 和 any 功能为此行为.与往常一样,文档是您的朋友: https://docs.pypython.org/2/library/functions. html#all
32 2024-04-01
编程技术问答社区
布尔逻辑设计-减法
i具有以下功能要降低/简化. f(a,b,c,d)= bc +(a + c'd'),其中'表示补充 Here's my solution: = BC + (A + C'D')' = BC + (A + (C+D) = BC + (A + C + D) = BC + C + A + D = C(B + 1) + A + D = C*1 + A + D = C + A + D 这是正确的吗? 解决方案 与传统代数一样,如果您对方程式的一侧做某事,则必须向另一侧进行操作,包括补充.在这里,我们陈述原始方程: f'(a,b,c,d)= bc +(a +(cd)') 由于我们有f'而不是f,所以我的直觉告诉我对双方进行补充,但是首先,我在术语(CD)中分发了补充,从长远来看: f'= bc +(a +(c' + d')) 现在我们可以补充等式的两面: 1:f ='(bc)'(a +(c' + d'))或变为和之后分发补充 现
22 2024-04-01
编程技术问答社区
计算布尔函数密度的算法
我正在尝试编写一个程序,该程序需要计算处理布尔函数的特定值.给定一个单输出布尔函数f,盖子f给出,假设我将函数的密度定义为所有输入向量的分数,其中该函数具有值1. 例如,假设我传递给定函数f(a,b,c),该函数由封面f = ab'+c'定义.该函数具有5个固定的矿物质,总计8个矿物质,因此其密度为d(f)= 5/8 = 0.625.应该注意的是,立方体AB覆盖了2个Minterm,并且Cube C覆盖了4个Minterm,但其中一个Minterms被两个立方体覆盖. 任何人都可以想到一个好的算法来处理这个问题吗?我非常怀疑它将最好地递归地表达,但是我很难确定一些有效的东西. 解决方案 坏消息:没有希望总是很快的算法. 即,这个问题: 给定布尔公式以连接的法线形式(总和的乘积),确定是否存在自由变量的分配,以使公式产生true 是NP完整的.这意味着,如果您发现解决该算法的多项式算法可以解决它,则可以在多项式时间内解决世界上一些最困难的问题(knap
12 2024-04-01
编程技术问答社区
解决命题逻辑/布尔表达式的工具(SAT解算器?)
我是命题逻辑和布尔表达式主题的新手.这就是为什么我需要帮助的原因.这是我的问题: 在汽车行业中,购买汽车时,您可以选择数千种不同的组件.并非每个组件都是可组合的,因此对于每辆车,都有许多在命题逻辑中表达的规则.就我而言,每辆车都有2000至4000条规则. 他们看起来像这样: a→b∨c∨d c→¬f f∧g→D ... 其中"∧" =" and"/"/"∨" ="或"/"/"网="非"/"→" ="含义". 变量A,B,C,...与材料法案中的组件链接.我的数据由成对的组件及其链接变量组成. 示例: component_1,component_2:(a)∧(b) component_1,component_3 :( a)∧(c∨f) component_3,component_5 :(b∨G) ... 现在,我的问题是如何解决这个问题.具体来说,我想知道组件的每种组合是否可以根据上述规则. . 哪种工具,软件和算法可以解决
20 2024-04-01
编程技术问答社区
无法弄清C语言程序中的逻辑错误
一个程序,可以打印其输入一个单词的输入. int main() { int c; while ((c=getchar()) != EOF) { if (c== ' ' || c== '\n' ||c == '\t') putchar('\n'); else { putchar(c); } } return 0; } 以上程序正确打印结果,每行一个单词.在相应地更改条件之后,我期望以下程序也将每行打印一个单词.但是我没有得到正确的结果.我是犯一些愚蠢的错误还是有问题? int main() { int c; while ((c=getchar()) != EOF) { if (c != ' ' || c != '\n' || c != '\t') putchar(c);
10 2024-04-01
编程技术问答社区
重构布尔表达式的工具
我正在寻找一种重构布尔表达的工具.我有 的表达 a1 => (b1 c or d) AND a2 => (b2 c or d) AND a2 => (b2 c or d) 该工具应能够简化表达式,例如在上面的示例中提取子表达式" C或D".有没有免费的计算机代数系统可以执行此操作? 目前,我认为手动重构表达式证明了与小haskell QuickCheck脚本的等价. 解决方案 我不确定工具,但请看一下 您可以绘制所有输入和输出的网格,以尝试找到最小的布尔表达 其他解决方案 它是针对解析语言(包括Java)的广义编译器技术,可用于ASTS和符号表. DMS还提供源代码转换,以及重写的关联和交换法. 您的布尔表达方式将显示为Java AST表达树. 通过提供有关布尔代数的一组规则,您可以操纵 那些表达树. 过去,我们已经在大规模表达式和大量的中等尺度表达式(类似于您的示例)上进行了C,RLL和诊断方程式系统的布尔表达
4 2024-04-01
编程技术问答社区
为什么产品被称为minterms,而和被称为maxterms?
他们有这样做的理由吗?我的意思是,在最小的总和中,您在输出1中寻找术语;我不明白为什么他们将其称为"最新".为什么不大于0,因为1大于0? 我不知道的背后有原因吗?还是我应该接受它而不问为什么? 解决方案 称这些术语为"最小"和" maxterms"的约定与1相对应大于0.我认为最好的回答方法是: : 说您有一个电路,由X̄YZ̄ + XȲZ描述. "此形式由两组三组组成.每组三组是'minterm'.表达式旨在暗示表达式中的每个三个组中的每个组中的每一组仅为1个值1对于X,Y和Z及其逆向的八个可能组合之一." /logic2.html 因此,"最小"是指这些术语是您需要构建某个功能所需的"最小"术语.如果您想要更多信息,上面的示例将在提供的链接中的更多上下文中解释. 编辑:"他们使用最小的原因和最大的原因"是: 在中,产品的总和(您称之为),只有一个秘密才能正确. 在总和的乘积(您称之为ors)中,所有最大都必须为真. 其他解决方案
20 2024-04-01
编程技术问答社区
布尔表达式的对偶和补码之间有什么区别?
这是同一件事吗?还是有微小的区别?我只是想确保我不会误解任何东西. 解决方案 布尔二二元是通过简单地用ors和ors和ands替换为ands来生成的.补充本身不受影响,因为表达式的补充是变量用ORS替换为变量,反之亦然. 考虑: A+B 补充:A'B' dual:AB 其他解决方案 "身份的双重性也是一个身份.这称为二元性原理".布尔的身份为x+0 = x或x+x = x.有很多.双人只能与身份一起工作.要找到双重的要切换运算符(+&.)和切换身份元素(0&1,如果有0和1)以更改x+0 = x为x.1 = x,并更改x+x = x x.x = x创建新的身份,这也是有效的.从X'y+Xy'= 1的任意表达式创建双重表达式没有意义.补充取决于诸如f1(x,y)= x'y+xy'之类的任意表达如果将相同的值插入F2(x,y),则将值插入F1(X,Y)将为您提供相反的结果.通过否定每个变量并切换每个操作员来形成补充. 其他解决方案 假设功能f =
10 2024-04-01
编程技术问答社区
Java中的布尔表达式优化
考虑Java中的以下方法: public static boolean expensiveComputation() { for (int i = 0; i 此外,编译器是否尝试对布尔值进行其他逻辑简化或排列以生成更快的代码?如果没有,为什么?当然,一些优化会非常困难,但是我的例子并不简单吗?打电话的方法总是比阅读布尔值慢,对 预先感谢您. 解决方案 它没有这样做,因为Expensi
if (boolean == false) vs. if (! boolean)
可能的重复: 对明确与布尔常数相比,例如如果(b == false)在Java中? in this NotepadProvider示例代码> if (values.containsKey(NoteColumns.CREATED_DATE) == false) { values.put(NoteColumns.CREATED_DATE, now); } Over: if (!values.containsKey(NoteColumns.CREATED_DATE)) { values.put(NoteColumns.CREATED_DATE, now); } 第一种形式比逻辑上有任何优势吗? 解决方案 除了"可读性",不.它们在功能上等效. ("可读性"是在引号中,因为我讨厌== false并找到!更可读. 其他解决方案 主要是可读性.当阅读其他代码时,读取不包含键 !values.co
20 2024-04-01
编程技术问答社区
'false === $var'和 '$var === false'之间有什么区别?
一个比另一个更可读吗?起初,我不喜欢false ===方法,但是正如我越来越多地看到的那样,我正在为此热身.我很确定他们返回相同的结果. 解决方案 我非常喜欢 false === $var 是因为有时您只是在使用平等而不是寻找身份. 在这种情况下,您写 false == $var ,但有时您不在游戏的顶部,并且可能会写 false = $var 这将立即出现错误,让您立即修复它. 但是,如果您键入 $var = false 您最终将头靠在墙上一个小时,试图弄清楚为什么您的脚本无法正常工作. 其他解决方案 绝对没有功能差异. 我通常更喜欢将变量首先放置,而恒定值 second.因为这是有道理的(当您大声说出来时,您会说"我测试变量是错误的"?或"我测试false等于变量"?) ) 其他解决方案 一位比我更好的软件工程师教会了我.长话短说,放置不变的是最好的做法,尽管一开始看起来可能很奇怪.我说这是一个最好的
22 2024-04-01
编程技术问答社区
简化布尔表达式算法
有人知道一种简化布尔表达式的算法吗? 我记得布尔代数和karnaught地图,但这是针对埃维特希(Everithing)的数字硬件.我想考虑到某些子表达不是布尔值的事情. 例如: a == 1 && a == 3 这可以翻译成纯净的布尔表达: a1 && a3 ,但这是不可约的,而对Everibody的算术知识也可以确定表达只是: false 有些身体知道一些链接? 解决方案 您可能对 k-maps 和 quine -mcccluskey algorithm . 我认为Sympy能够解决并简化布尔表达式,查看源可能很有用. 其他解决方案 您的特定示例将通过 smt solver . (它可以确定变量的设置不可能使表达式成真;因此它始终是错误的.更简化此类求解器的范围不超出范围.)表明表达式等于true或false是当然,即使没有将算术纳入交易,NP-Hard即使没有将算术算起,因此甚至还有很多实用的软件也很酷.根据范围中的
6 2024-04-01
编程技术问答社区
如何理解德摩根法则布尔表达式
试图理解这种表达时,我被搞砸了.我已经想过几次,但我无法获得意义. ! (p || q)等效于!p &&!q 为此,我以某种方式可以理解一点. 我的理解是"不是(p q)=不是p,而不是q",这是可以理解的 ! (P && Q)等效于!P || !问 第二个,我完全被搞砸了.怎么来 我的理解是"不是(p q)=不是p或q q n而非q".如何和或可以彼此相同?至于&&和||之间的真实表中的规则是不同的. 这就是我理解每个表达式的方式,也许我有一个错误的方法来理解该表达式.你能告诉我如何理解这些表达吗? 解决方案 您可以使用真相表来查看两个表达式如何相等.这样: !(P || Q) = !P && !Q _________________________________________________ P Q P || Q !(P||Q) !P !Q !P && !Q __________________________
18 2024-04-01
编程技术问答社区
有什么好的布尔表达式简化器吗?
我正在重构旧代码,如果条件太复杂且长时间,我肯定可以简化它们.我的猜测是这些条件由于以后的修改而变得如此之多. 无论如何,我想知道你们是否知道我可以使用一个很好的在线简化者.我对任何特定语言都不感兴趣,只是一个简化的语言,例如: ((A或B)和(!B和C)或C) 并给我一个简化的表达式版本,如果有的话. 我已经看过其他类似的问题,但没有人指出一个很好的简化者. 谢谢. 解决方案 您可以根据您的输入来尝试以下示例中的wolfram alpha: http://www.wolframalpha.com/input/?i=((((a%20or%20B)%20B)%20AND%20(不是%20B%20 and%20C)%20C)&t = RC 其他解决方案 尝试Logic Friday 1它包括加利福尼亚大学(意式浓缩咖啡和米西)的工具,并使它们可与GUI一起使用.您可以根据需要输入布尔方程式和真相表.它还具有图形门图输入和输出. 最小化
18 2024-04-01
编程技术问答社区
Java中布尔表达式的求值顺序?
假设我有以下表达式 String myString = getStringFromSomeExternalSource(); if (myString != null && myString.trim().length() != 0) { ... } Eclipse警告我,myString在布尔表达的第二个短语中可能无效.但是,我知道有些编译器如果第一个条件失败,则有些编译器将完全退出布尔表达式. Java是正确的吗?还是不能保证评估顺序? 解决方案 但是,我知道有些编译器如果第一个条件失败,则有些编译器将完全退出布尔表达式. Java是正确的吗? 是的,这被称为 short-circuit评估. ||是执行此类操作的操作员. 或评估顺序无法保证? 否,保证评估顺序(从左到右) 其他解决方案 Java应从左到右评估您的陈述.它使用一种称为短路评估以防止第二,第三和nth的机制如果第一个是错误的测试条件. 因此,如果您的表达式为myCo
0 2024-04-01
编程技术问答社区