想象一下,我们想要描述一个满足以下真值表的组合电路:
a b | s0 s1 s2 s3
-----------------
0 0 | 1 d d d
0 1 | 0 1 d d
1 0 | 0 0 1 d
1 1 | 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
(其中,d代表"不关心"值,也就是说,我们不关心此输出的值是0还是1)
如果我们通过传统设计,我们可以利用这些"不关心"并为它们分配最方便的值,因此得到的方程(因此,电路)是最简单的.例如,我们可以将之前的真值表更改为:
a b | s0 s1 s2 s3
-----------------
0 0 | 1 1 1 1
0 1 | 0 1 0 1
1 0 | 0 0 1 1
1 1 | 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
最终的方程是(使用Verilog表示法):
s0 = …Run Code Online (Sandbox Code Playgroud) 假设我想编写一个使用 4 个输入和 3 个输出的组合模块。为了模拟我的逻辑,我做这样的事情:
module ifelse (
input wire a,
input wire b,
input wire c,
input wire d,
output reg y1,
output reg y2,
output reg y3
);
always @* begin
if (a==1'b1 && b==1'b0) begin
y1 = 1'b0;
y3 = 1'b1;
end
else if (a==1'b0 && c==1'b1 && d==1'b0) begin
y2 = 1'b1;
y1 = 1'b1;
end
else if (a==1'b0 && c==1'b0) begin
y3 = 1'b0;
y2 = 1'b0;
end
end
endmodule
Run Code Online (Sandbox Code Playgroud)
好的,我知道这段代码会推断y1,y2和 …
最近,我遇到了一段这样的代码(不是真正的代码,而是一个基于它的简短示例):
#include <stdio.h>
int main()
{
int n;
printf ("n? ");
scanf ("%d", &n);
n%2 && printf ("N is odd\n"); /* <-- this is it */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果有人没有得到它,这段代码相当于:
int main()
{
int n;
printf ("n? ");
scanf ("%d", &n);
if (n%2)
printf ("N is odd\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于x86-64位,使用GCC 4.4.5-8编译的此代码的反汇编为此部分提供了n评估并printf()有条件地调用的部分:
andl $1, %eax
testb %al, %al
je .L3
movl $.LC2, %eax
movq %rax, %rdi
movl $0, %eax
call printf
testl %eax, %eax
.L3:
movl …Run Code Online (Sandbox Code Playgroud) 该计划旨在接收'n'个学生及其名字并对其进行排序(没有进入排序部分).我无法弄清楚为什么我的程序在测试时崩溃了.这是代码:
#include<stdio.h>
#include <stdlib.h>
#define MaxNameLen 100
int main() {
int n;
scanf("%d", &n);
char *names;
char **pointerToNames = (char **) malloc(n * sizeof(char));
if (pointerToNames == NULL)
return 0;
int i;
for (i = 0; i <= n; i++) {
names = (char *) malloc(MaxNameLen);
gets(names);
pointerToNames[i] = names;
}
for (i = 0; i < n; i++) {
free(pointerToNames[i]);
free(names);
}
}
Run Code Online (Sandbox Code Playgroud)