Tag:

C中的按位逻辑

我对按位操作有一定的了解,但这个function只是我的头脑。 void binary_print(unsigned int value) { unsigned int mask = 0xff000000; // Start with a mask for the highest byte. unsigned int shift = 256*256*256; // Start with a shift for the highest byte. unsigned int byte, byte_iterator, bit_iterator; for (byte_iterator=0; byte_iterator < 4; byte_iterator++) { byte = (value & mask) / shift; // Isolate […]

循环通过位C

我试图遍历无符号字符的位,但我不知道从哪里开始,最终,我将对这些位执行其他按位操作,例如〜和xor..etc。

C中的符号扩展

我正在这里了解标志扩展: http : //www.shrubbery.net/solaris9ab/SUNWdev/SOL64TRANS/p8.html struct foo { unsigned int base:19, rehash:13; }; main(int argc, char *argv[]) { struct foo a; unsigned long addr; a.base = 0x40000; addr = a.base << 13; /* Sign extension here! */ printf("addr 0x%lx\n", addr); addr = (unsigned int)(a.base << 13); /* No sign extension here! */ printf("addr 0x%lx\n", addr); } […]

找到char变量中唯一’1’位的索引的最有效方法(在C中)

这是一个面试问题: 给你一个名为ch的char变量,当你知道它代表一个二进制forms的数字时,它的八位中只有一个将等于’1’。 IE, ch的唯一可能值是: 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 。 给定变量ch ,我需要编写最有效的代码来获得该’1’位的索引。 例如:如果ch == 0x1 – >结果为0.如果ch == 0x4 – >结果为2。 显而易见的方法是使用switch-case,但我需要更高效的东西。 为了有效实施,您可以在这里进行任何操作吗?

用于计算存储数字n所需的位数的宏

假设我需要编写C宏来返回存储无符号32位整数所需的位数(1..32)。 (结果等于上限(log2(n))。 我需要它作为编译时计算宏,而不是函数。 我可以 #define NBITS(n) ((n)&(1<<31)?32:(n)&(1<<30)?31:… 它有效,但相当长。 (速度与此无关,计算在编译时)。 有没有更短的方法来编写这个宏? 最短的?

在C中设置位

我正在尝试执行以下操作: 写一个func setbits(x,pn,y)返回x其中n位从位置p开始,设置为y的最右边n位,其他位保持不变? 我试过这样但没有得到正确的答案。 任何人都可以告诉我哪里错了吗? unsigned setbits(unsigned x,int p,int n,unsigned y) { return (x>>p & (y|(~0<<n))); }

甚至无符号整数的奇偶校验

/*A value has even parity if it has an even number of 1 bits. *A value has an odd parity if it has an odd number of 1 bits. *For example, 0110 has even parity, and 1110 has odd parity. *Return 1 iff x has even parity. */ int has_even_parity(unsigned int x) { } 我不知道从哪里开始编写这个函数,我认为我将值作为数组循环并对它们应用xor操作。 […]

可以向文件写入少于1个字节

据我所知,C中的最小单位是一个byte 。 这种约束来自哪里? 中央处理器? 例如,如何将nibble或单个bit写入文件?

为什么endianess在一个字节内的位之间很重要?

以下是linux机器上库的IP结构 struct ip { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ip_hl:4; /* header length */ unsigned int ip_v:4; /* version */ #endif #if __BYTE_ORDER == __BIG_ENDIAN unsigned int ip_v:4; /* version */ unsigned int ip_hl:4; /* header length */ #endif u_int8_t ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; […]

如何根据“Endianness”将数据存储在位级别?

我读到关于Endianness并理解蹲下…… 所以我写了这个 main() { int k = 0xA5B9BF9F; BYTE *b = (BYTE*)&k; //value at *b is 9f b++; //value at *b is BF b++; //value at *b is B9 b++; //value at *b is A5 } k等于A5 B9 BF 9F 和(字节)指针“ walk ”o / p是9F BF b9 A5 所以我得到它的字节向后存储……好吧。 〜 所以现在我想它是如何存储在BIT级别的…… 我的意思是“9f”(1001 1111)存储为“f9”(1111 1001)? 所以我写了这个 […]