当前位置: 首页 > article >正文

C语言日记 2024年11月2日

目录

总结:

内容:


总结:

右移:>>

用例如下:

#include <stdio.h>
int main()
{
    int n=8;
    printf("n=%d\n",n);
    n=n>>1;
    printf("n=%d\n",n);
    n=n>>1;
    printf("n=%d\n",n);
    n=n>>1;
    printf("n=%d\n",n);
    n=n>>1;
    printf("n=%d\n",n);
    return 0;
}

简单来说就是将你的这个数的二进制形式全体向右移。(向右移的内容并不会从左边冒出来。)

内容:

这道题比较简单,我的大体思路也都写在注释里了。

3226. 使两个整数相等的位更改次数
简单
给你两个正整数 n 和 k。

你可以选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0。

返回使得 n 等于 k 所需要的更改次数。如果无法实现,返回 -1。

示例 1:

输入: n = 13, k = 4

输出: 2

解释:
最初,n 和 k 的二进制表示分别为 n = (1101)2 和 k = (0100)2,

我们可以改变 n 的第一位和第四位。结果整数为 n = (0100)2 = k。

示例 2:

输入: n = 21, k = 21

输出: 0

解释:
n 和 k 已经相等,因此不需要更改。

示例 3:

输入: n = 14, k = 13

输出: -1

解释:
无法使 n 等于 k。

提示:

1 <= n, k <= 106

我的代码是这样的。

int minChanges(int n, int k) {
    //如果一开始,n的二进制表示中的1不能覆盖k的1,那就返回-1.如果能覆盖,那么将两个二进制数组比较。
    //最后得出更改需要的次数。
    //用整形存这个二进制数是不行的,会溢出,我也想过用字符串存,但是太麻烦,最后发现根本不用存这个二进制。
    int num=0;
    if(n==k)
    {
        num=0;
    }
    else
    {
        int t1;
        int t2;
        while(n)
        {
            t1=n%2;
            t2=k%2;
            n=n/2;
            k=k/2;
            if(t1>t2)
            {
                num++;
                continue;
            }
            else
            {
                if(t1==t2)
                {
                    continue;
                }
                else
                {
                    num=-1;
                    break;
                }
            }
        }
    }
    if(k>n)
    {
        num=-1;
    }
    return num;
}

它的标准答案和我思路相似,但是我的更麻烦。

int minChanges(int n, int k) {
    int res = 0;
    while (n > 0 || k > 0) {
        if ((n & 1) == 0 && (k & 1) == 1) {
            return -1;
        }
        if ((n & 1) == 1 && (k & 1) == 0) {
            res++;
        }
        n >>= 1;
        k >>= 1;
    }
    return res;
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/number-of-bit-changes-to-make-two-integers-equal/solutions/2969568/shi-liang-ge-zheng-shu-xiang-deng-de-wei-bzfv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

它还有一个答案用到了__builtin_popcount()这个函数,写的更简洁,但是就不太好懂了,我就不放在这里了。

这个函数能返回你的数字的二进制形式里边1的个数。


http://www.kler.cn/a/376186.html

相关文章:

  • MySQL的SQL语句之触发器的创建和应用
  • Windows下Jenkins自动启动jar包
  • 项目管理计算公式中的PV、EV、AC、CV、SV、CPI、SPI、ETC、EAC、BAC术语含义
  • JAVA基础:jdbc (学习笔记)
  • 【算法+C#】重写HashCode,去重相同坐标的二维点
  • 7、lvm逻辑卷和磁盘配额
  • 利士策分享,锚定未来:稳健规划人生
  • git reset 删除错误提交
  • 【Python爬虫实战】网络爬虫完整指南:HTTP/HTTPS协议与爬虫安全实践
  • 博物馆3D数字化的优势有哪些?
  • ArcGIS Pro SDK (二十)流图层
  • 【Android】初始路由框架及ARouter原理
  • 基于Matlab GUI的说话人识别测试平台
  • 一般无人机和FPV无人机的区别
  • 使用 MMDetection 实现 Pascal VOC 数据集的目标检测项目练习(二) ubuntu的下载安装
  • 【算法】奇数在偶数后、反转字符串中的单词
  • 仿真工具Modelsim和QuestaSim有什么区别?
  • 摄像机实时接入分析平台LiteAIServer视频智能分析软件诊断噪声检测
  • 利用Claude制作web小游戏(一):俄罗斯方块
  • 【Linux第七课--基础IO】内存级文件、重定向、缓冲区、文件系统、动态库静态库
  • JavaScript 进阶 - 第2天 (黑马笔记)
  • 数字后端零基础入门系列 | Innovus零基础LAB学习Day7
  • 必备!20道大模型面试问题详解(含答案)
  • Edge 浏览器插件开发:图片切割插件
  • 信息学科平台系统设计与实现:Spring Boot框架
  • 做等保二级备案需要准备哪些材料