for (int i = 32; i <= 127; i++) {
}
Run Code Online (Sandbox Code Playgroud)
我将数字转换int 32为二进制数00100000,并将数字int 127转换为二进制数01111111。我需要从右侧读取的第一个位置(位编号 - 找到第一个集合(ffs)或找到第一个(ffo)),00100000 ->6和 01111111 ->1
谢谢你!
所以我必须在C中找到unsigned char变量的设置位(在1上)?
类似的问题是如何计算32位整数中的设置位数?但它使用的算法不易适应8位无符号字符(或不明显).
我想编写一个程序来获取比较两个数字时 1 位的数量。我想比较任意两个数字之间的位,以找出二进制数在 1 和 0 中的不同之处。换句话说,“异或”(XOR)关系。
就像如果 22(有10110二进制)并将其与 15(有01111二进制)进行比较
第一个是10110。第二个是01111。
结果:11001。
答案是 25,但我想要的是 3,其中三个1s 和0s 不同。
我正在寻找解决方案如何生成16位,65536元素查找表来计算设置位.我知道生成8位表我可以使用:
static const unsigned char BitsSetTable256[256] =
{
# define B2(n) n, n+1, n+1, n+2
# define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
# define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
B6(0), B6(1), B6(1), B6(2)
};
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在16位中做到这一点
大多数答案仅针对已经回答的有关汉明重量的问题,但忽略了关于find稀疏性的观点.显然,通过夏嘉曦答案在这里解决了约找到一点-但我现在还无法验证它.我在这里的答案并没有利用其他答案的独创性,比如位移,但足够好的例子答案.
输入
>> mlf=sparse([],[],[],2^31+1,1);mlf(1)=10;mlf(10)=111;mlf(77)=1010;
>> transpose(dec2bin(find(mlf)))
ans =
001
000
000
011
001
010
101
Run Code Online (Sandbox Code Playgroud)
目标
1
0
0
2
1
1
2
Run Code Online (Sandbox Code Playgroud)
使用稀疏结构快速计算二进制数的1?
我有一个有趣的问题,让我寻找一种更有效的做事方式.
假设我们有一个值(二进制)
(VALUE) 10110001
(MASK) 00110010
----------------
(AND) 00110000
Run Code Online (Sandbox Code Playgroud)
现在,我需要能够对(AND)值中设置的值中的任何位进行异或(MASK)(始终从最低位到最高位):
(RESULT) AND1(0) xor AND4(1) xor AND5(1) = 0Run Code Online (Sandbox Code Playgroud)
现在,在纸面上,这肯定很快,因为我可以看到掩码中设置了哪些位.在我看来,在程序上我需要保持正确移位MASK直到我找到一个设置位,将其与一个单独的值进行异或,并循环直到整个字节完成.
谁能想到更快的方式?我正在寻找使用最少数量的操作和存储值来实现此目的的方法.
例如:
b = [TTFFTF],则函数返回 3 。
我可以通过 for 循环程序来做到这一点。但是,是否有函数返回“布尔向量中真值的数量”来比 for 循环程序更快地做到这一点?
谢谢。
我试图更多地了解比特,我遇到了这个例子.
这段代码如何计算这些位?(顺便说一句,我的C很生锈).
unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
for (c = 0; v; v >>= 1)
{
c += v & 1;
}
Run Code Online (Sandbox Code Playgroud) int f(int n)
{
int i, c = 0;
for (i=0; i < sizeof(int)*8; i++, n >>= 1)
c = (n & 0x01)? c+1: c;
return c;
}
Run Code Online (Sandbox Code Playgroud)
这是我在书上发现的练习,但我真的不明白!
我正在做一些编程,我想将网络掩码转换为网络前缀长度.
例如255.255.255.0 ----> 24.
最后我写了一些代码来做到这一点.
const char *network = "255.255.255.0";
int n = inet_addr(netowrk);
int i = 0;
while (n > 0) {
n = n << 1;
i++;
Run Code Online (Sandbox Code Playgroud)
}
我将是网络数量
unsigned mystery(int x){
unsigned i = 0;
while(x){
x = x&(x-1);
i++;
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
我认为这会返回'2'的幂,直到我们给出的数字.