LeetCode 1009. 十进制整数的反码(位运算)
发布日期:2021-07-01 03:15:38 浏览次数:2 分类:技术文章

本文共 812 字,大约阅读时间需要 2 分钟。

1. 题目

每个非负整数 N 都有其二进制表示。例如, 5 可以被表示为二进制 “101”,11 可以用二进制 “1011” 表示,依此类推。注意,除 N = 0 外,任何二进制表示中都不含前导零。

二进制的反码表示是将每个 1 改为 0 且每个 0 变为 1。例如,二进制数 “101” 的二进制反码为 “010”。

给定十进制数 N,返回其二进制表示的反码所对应的十进制整数。

2. 解题

  • 求出二进制的非零位数,再用32减去它,左移这么多位(高位没了),取反(结果+111…),再右移这么多位(末位的111…去掉了)
class Solution {
public: int bitwiseComplement(int N) {
if(N == 0) return 1; int bits = 32, Nc = N; while(Nc) {
bits--; Nc >>= 1; } return ~(N << bits) >> bits; }};

一个数和它的反码之和等于 2 n − 1 , n 表 示 二 进 制 位 数 2^n-1,\quad n表示二进制位数 2n1,n

class Solution {
public: int bitwiseComplement(int N) {
if(N == 0) return 1; int bits = 0, Nc = N; while(Nc) {
bits++; Nc >>= 1; } return (1 << bits) - 1 - N; }};

在这里插入图片描述

转载地址:https://michael.blog.csdn.net/article/details/101197758 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:LeetCode 67. 二进制求和
下一篇:LeetCode 784. 字母大小写全排列(位运算&回溯)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月16日 11时31分56秒