【问题标题】:whats wrong with this odd number program? [closed]这个奇数程序有什么问题? [关闭]
【发布时间】:2012-12-31 06:00:45
【问题描述】:

我想知道一个数字是不是奇数。 我想比较 LSB 而不是使用模数。

int main(int argc, char*argv[])
{
    if ( argc >1 ) {
        if ( atoi(argv[1]) & 0x1 == 1 ) 
            printf ("odd num \n");
    }
    return 0;
}


# ./odd 2
# ./odd 3
odd num 
# ./odd 22
# ./odd 23
# ./odd 33
odd num 
# ./odd 43
# ./odd 52
odd num 
# file odd
odd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x56f7eb1e7a35762bd8b786eefb5516a14549fc1f, not stripped

【问题讨论】:

标签: c++ c


【解决方案1】:

您将数字与数字表示混淆了。这个程序的输入是一个像“22”这样的数字(十进制数字“2”重复两次)的表示,而不是像二十二这样的数字(二十一之后的那个)。告诉编译器假装它是一个数字是行不通的。

   if ( *(unsigned int*)argv[1] & 0x1 == 1 )

由于argv[1] 是一个指向字符串的指针,告诉编译器假装它是一个指向无符号整数的指针会给你带来垃圾。

您可能需要atoi(argv[1]),它将表示十进制形式数字的字符串转换为它所表示的数字。

【讨论】:

  • 他不是在检查第一个参数的第一个字符的最低有效位吗?
  • 克鲁德,我第一次做对了。编辑...
  • 是的,“垃圾”更好地描述了发生的事情。它只是在 little-endian 机器上的第一个字符,并且如果你不幸有一个对齐的指针(或者有一台不会给你总线错误的机器......)。
  • 我很确定您知道许多比 @​​987654324@ 更好的方法。
猜你喜欢
  • 2019-05-15
  • 2015-01-12
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
相关资源
最近更新 更多