学网站建设的软件,花都有沒有网站建设的,常用的博客建站程序,网站建设哪家好服务#x1f436;博主主页#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️#x1f525;专栏系列#xff1a;线性代数#xff0c;C初学者入门训练 #x1f525;座右铭#xff1a;“不要等到什么都没有了#xff0c;才下定决心去做” #x1f680;#x1f680;#x1f680;大家觉不错… 博主主页ᰔᩚ. 一怀明月ꦿ ❤️专栏系列线性代数C初学者入门训练 座右铭“不要等到什么都没有了才下定决心去做” 大家觉不错的话就恳求大家点点关注点点小爱心指点指点 目录
取余取模法
按位与法
nn(n-1)法
随记 取余取模法 我们这里求的二进制数的1的个数求的是补码中1的个数 这种方法和十进制取余取模类似的只是把10换成了2例如12345 12345%105 12345/101234 1234%104 1234/10123 ...... 二进制也一样例如12 12%20 12/26 6%20 6/23 3%21 1/20 1%21 #includestdio.h
int main()
{int a-1,count0,num0;unsigned int ba;while(b){numb%2;b/2;if(num1){count;}}printf(%d\n,count);return 0;
} 这里负数也不用担心我们把负数的补码转化为无符号数这样也可以的到负数的补码了。 按位与法 这种方法就是利用按位与的性质aba和b相同的数就为相同的数a和b不同的数则为0例如a1000 0011 b0110 0001 cab 1000 0011 0110 0001 c0000 0001 如果我们一个数a1,且每次按位与完我们就右移一位1例如a121100 11001: 1100 1 num:0 a1: 110010110 01101: 0110 1 num:0 a1: 011010011 00111: 0011 1 num:1 a1: 001110001 00011:0001 1 num:1 a1: 000110000 00001: 0000 1 num:0 然后统计num为1的次数就可以了 #includestdio.h
int main()
{int a-1,count0,num0;for(int i0;i32;i){numa1;if(num1){count;}aa1;}printf(%d\n,count);return 0;
} nn(n-1)法 只运算一次n的二进制中最右边的一个1就会消失例如n1100 n: 1100 n-1: 1011 n(n-1): 1000 n: 1000 n-1: 0111 n(n-1): 0000 然后统计n经历了几次n(n-1)后变为0的 #includestdio.h
int main()
{int a-1,count0;int numa;while(num){numnum(num-1);count;}printf(%d\n,count);return 0;
} 这三种方法中nn(n-1)法 是效率最高的一种方法 我们在判断一个数是否是2的次幂数也可以用nn(n-1)法 因为2的次幂数又个特点就是二进制只有一个1例如 2^0: 0001 2^1: 0010 2^2: 0100 2^3: 1000 ...... #includestdio.h
int main()
{int num102;numnum(num-1);if(num0){printf(是\n);}else{printf(不是\n);}return 0;
} 随记 今天还使用到了一些小的知识点 1.全局变量不初始化就是默认为0 2.如果说一个整数和一个无符号整形数比较时要被转化为两个无符号数比较例如a-1,sizeof(a) if(asizeof(a)) 这里sizeof(a)4,sizeof(a)得到是一个无符号数比较时a得转化为无符号数 a-1:原码10000000000000000000000000000001 反码1111111111111111111111111111111111111111110 补码1111111111111111111111111111111111111111111 当a转化为无符号数时1111111111111111111111111111111111111111111这就是原码这将是一个非常大的数肯定大于sizeof(a) 3.栈区的使用习惯先使用高地址再使用低地址常规情况下release就除外了 4.大端字节序把一个数据的低字节的数据存放在高地址处把高字节的数据存放在低地址处 小端字节序把一个数据的低字节的数据存放在低地址处把高字节的数据存放在高地址处 如果大家还有不懂或者建议都可以发在评论区我们共同探讨共同学习共同进步。谢谢大家