处理两个32位整数值A和B,以按照以下规则给出32位整数C和D. 哪些规则是可逆的?也就是说在所有情况下都可以获得给定c和D的A和B?
A. C =(int32)(A + B),D =(int32)(AB)
B. C =(int32)(A + B),D =(int32)((AB)>> 1)
C.C =(int32)(A + B),D = B.
D. C =(int32)(A + B),D =(int32)(A + 2*B)
E. C =(int32)(A*B),D =(int32)(A/B)
关于整数运算的几个问题.模块化加成形成称为阿贝尔群的数学结构.签名加法怎么样?它也是可交换的(这是"阿贝尔"部分进入的地方)和联想,这是一个阿贝尔群体吗?
鉴于整数加法是可交换和关联的,C显然是正确的,因为我们可以通过(A +(BB))检索A. D怎么样?我们可以假设2 * B = B + Bst.B = A+B+B-(A+B)?
乘法更复杂,但我知道如果有溢出则无法检索A.
如果我将两个16位数相乘,结果将是32位长.但为什么会这样呢?这有什么明确的解释?
并且为了正确理解:对此的计算是:n位数乘以m位数给出(n + m)位数?
是的,我知道这是一个有点疯狂的问题.请不要问我是否真的需要知道答案,或者这是否真的是"我的"问题.谢谢.
有时以下功能非常好:
isNeg# :: Int# -> Int#
isNeg# x
| x <# 0# = -1#
| otherwise = 0#
Run Code Online (Sandbox Code Playgroud)
例如,它可以像这样使用:
cc# f x y = word2Int# (f (int2Word# x) (int2Word# y))
andi# x y = cc# and# x y
xori# x y = cc# xor# x y
ori# x y = cc# or# x y
ifNegFstElseSnd# :: Int# -> Int# -> Int#
ifNegFstElseSnd# x y = case isNeg# x of
n -> ori# (andi# n y) (xori# n y)
Run Code Online (Sandbox Code Playgroud)
当 …
我正在读取一个24位值,现在变成一个uint32_t变量.
在我的头撞墙后计算两个这样的变量之间的区别,并认为"它是无符号的!为什么这个溢出是一个问题?!",我意识到这些值超出了包含它们的变量的大小.
这是一个计数器,因此人们知道它比另一个"更大",尽管可能已经溢出.
因此,0x1 - 0x2 = 0xFFFFFFFF但应该是0x00FFFFFF.
我该如何处理这个问题?
uint24;if/ else在做适当算术之前更大;"最佳"应被解释为"最佳实践"/"最具可读性"/"最安全".
以下代码在我的系统上产生奇怪的东西:
#include <stdio.h>
void f (int x) {
int y = x + x;
int v = !y;
if (x == (1 << 31))
printf ("y: %d, !y: %d\n", y, !y);
}
int main () {
f (1 << 31);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译-O1,这打印y: 0, !y: 0.
现在,除了删除int v或if行产生预期结果的令人费解的事实之外,我对溢出转换为逻辑不一致的未定义行为感到不舒服。
这应该被认为是一个错误,还是 GCC 团队的理念是,一个意外的行为可以级联成逻辑矛盾?
我有以下代码,其中结果超出了整数类型变量可以存储的限制,并且需要了解为什么我得到这个结果(268,435,456=2^28)
public static void main(String[] args) {
int x = 16+256;
for( int i =0; i<6; i++) {
x*=16;
}
System.out.println(x);
}
}
Run Code Online (Sandbox Code Playgroud) 我是一名相当高级的程序员(有 Java、Python、C#、C、C++ 经验),现在第一次尝试学习 Rust。Rust 与我之前尝试过的任何语言都非常不同,所以我很挣扎。为了了解这门语言,我正在实现一个小游戏。
在我的代码中的某个时刻,我想访问“板”中的一个元素和周围的元素。如果我的元素位于板的边缘(索引 0 或索引最大值),我需要一个剪裁值(例如索引 0 - 1 == 0) 如果我简化这个用例,我会尝试从数组和相对索引。下面是一个非常小的例子:
fn get_elements(array: &Vec<char>, i: usize, dx: i8) -> (char, char) {
let center = array[i];
let other = array[i+dx];
(center, other)
}
fn main() {
let data = vec!['a', 'b', 'c', 'd', 'e'];
let (c, o) = get_elements(&data, 2, -1);
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这无法编译,因为no implementation for `usize + i8` . 我理解这是因为对于无符号数来说,减去零以下的行为是未定义的。然而,我不清楚如何在 Rust 中实现所需的行为。
我正在尝试使用perl one liner为数字添加1000.这是我尝试过的:
perl -pi -e "s/ZZZ(\d+)ZZZ/ZZZ\1+1000ZZZ/e" file.txt
Run Code Online (Sandbox Code Playgroud)
我希望这会增加1000数字之间的数字ZZZ.但我收到错误消息:
Backslash found where operator expected at -e line 1, near "ZZZ\"
Bareword found where operator expected at -e line 1, near "1000ZZZ"
(Missing operator before ZZZ?)
syntax error at -e line 1, near "ZZZ\"
Execution of -e aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
问题示例:
计算123 * 456是否比计算123456 * 7890快?还是相同的速度?
我想知道32位无符号整数,但是我不会忽略其他类型(64位,有符号,浮点型等)的答案。如果不同,则有什么不同?这些位是否为0/1?
编辑:如果有所不同,我应该澄清一下,我指的是任何数字(两个低于100的随机数与两个高于1000的随机数)
C编程新手.为什么下面这段代码的输出不是0 20 0,而是它1 20 0?
printf ( "\n%d %d %d", x != 1, x = 20, x < 30 ) ;
Run Code Online (Sandbox Code Playgroud)
我的理解是代码将x分配给1以外的值(1 = true因此!= true为0)?有人能指引我完成逻辑吗?
我有个问题.在此程序中,变量x应设置为0x10000,但在两个操作中结果为0.
这不是主程序,而是查找错误原因的测试.我目前正在使用十六进制输入制作64位乘法器.我使用Keil和Proteus进行了16位乘法运算
int main() {
unsigned long int x = 0;
x = 0x8000 * 0x2;
x = 0x8000 + 0x8000;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我必须在C中添加一个数字.我必须在没有像'+','++'等算术运算符的情况下这样做.
我写了以下代码行.
int a = 1234;
int b = 1;
printf("%d", a ^ b);
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到达到整数限制,即,对于32位,它是4294967295.但我在许多其他网站中看到,执行相同的两个数字的AND,然后是XOR和左移.
请告知我的方法是否正确,因为我是C的新手.