首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基础知识 | 每日一面(1)

基础知识 | 每日一面(1)

作者头像
小林C语言
发布2019-12-18 16:49:16
发布2019-12-18 16:49:16
4150
举报
古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:求函数返回值,输入x=9999;

代码语言:javascript
复制
int func ( x ) 
{
    int countx = 0; 
    while ( x ) { 
    countx ++;
    x = x&(x-1); 
}
 return countx; 
} 

小林:

这是统计9999的二进制数值中有多少个1的函数,且有

9999=9×1024+512+256+15

9×1024中含有1的个数为2;

512中含有1的个数为1;

256中含有1的个数为1;

15中含有1的个数为4;

故共有1的个数为8,结果为8。

1000 - 1 = 0111,正好是原数取反。这就是原理。用这种方法来求1的个数是很效率很高的。不必去一个一个地移位。循环次数最少。

读者:什么是位域 ?

小林:

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。

例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。

所谓“位域”是 把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。

每个域有一个域 名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档