【问题标题】:Sizeof function using Bit wise operators使用按位运算符的 Sizeof 函数
【发布时间】:2017-02-19 03:41:10
【问题描述】:

如何仅使用按位运算符实现 sizeof 函数?这个问题是在面试时问我的。我试图解决它,但它只适用于无符号整数。这里我也附上了代码。

unsigned int a = 1;
int b = 0;
while(a != 0){
    a = a << 1;
    b++;
}
b = b/8;
printf("%d",b);

注意:不允许使用指针。

【问题讨论】:

  • 这个问题已经被回答[这里][stackoverflow.com/questions/14171117/….
  • 什么是“sizeof 函数”,如果不是 unsigned int,它应该如何工作?
  • 我投票决定将此问题作为离题结束,因为它具有误导性并且不太可能对未来的访问者有用; sizeof 不是函数,SO 也不是关于如何以最不明智的方式解决简单问题...
  • 实际上,我写的应该是您的回复,然后是“这是我的名片,当您需要不会浪费时间的程序员时告诉我这样毫无意义的练习”。
  • @Seb:我不同意这是一个愚蠢的练习,至少不是因为你给出的原因。当然,在生产代码中重新实现sizeof 是没有意义的,因为sizeof operator 已经存在。这不是问题的重点。重点是测试受访者解决问题的能力。 (我不相信(大部分)像sizeof can 这样工作的东西只能使用按位运算符来实现,但这是一个不同的问题;无论是问题还是 OP 的陈述似乎都不完整。)

标签: c bit-manipulation sizeof


【解决方案1】:

正如我之前写的,sizeof 不是函数;它是一个运算符,并且是一种特殊类型的运算符,其中不评估参数的值,因此sizeof *(char *)NULL 的原因是完全有效的并且不会导致段错误。这一点应该在采访中指出。

此外,这个问题是浪费时间,也是应该向面试官指出的事实。那时我会走出门,去接受更明智的采访。你可能不想为这家公司工作,如果他们经常追求这种毫无意义的练习。

话虽如此,对此感兴趣的人可能会得出结论,offsetof 宏可能很有用。形成一个包含给定类型和 dummy 元素的 struct,然后使用 offsetof 确定 dummy 元素的偏移量是多少。

#include <stddef.h>
#include <stdio.h>
#define my_sizeof(x) ((size_t) offsetof(struct { x fu; char ba; }, ba))
int main(void) {
    printf("my_sizeof (char):   %zu\n", my_sizeof(char));
    printf("my_sizeof (void *): %zu\n", my_sizeof(void *));
}

请注意,offsetof 宏在幕后可能会使用指针。我看到的唯一选择是使用&amp;address-of 运算符(例如this question),不要与按位&amp; 运算符混淆(我认为您和/或您的面试官正在这样做,也需要指出出去);这违反了您的要求,因为 肯定 使用了指针。

再一次,如果你根本不能使用指针,那么你就排除了数组和函数调用;由于该要求,整个语言实际上变得毫无用处。

【讨论】:

  • 匿名结构上需要__attribute__((packed))。否则my_sizeof(char) 可能是 4,因为对齐填充。
  • @JohnZwinck 一个有用的旁注,是的,你是对的......现在我们深入研究特定于实现的细节,不幸的是__attribute__((packed)) 是非标准的。
  • 当然,您可能应该编辑答案以使用char 而不是int
  • @JohnZwinck 完成。我仍然不喜欢这样,因为在技术上仍然允许使用填充,但是......愚蠢的练习会产生愚蠢的解决方案,嗯?
猜你喜欢
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
相关资源
最近更新 更多