From 2f7a6d3c24fae6f548eab4cac7c4b581ec39d156 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Fri, 21 Nov 2025 22:48:31 +0300 Subject: [PATCH 1/9] Add .clang-format --- .clang-format | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..f00c630 --- /dev/null +++ b/.clang-format @@ -0,0 +1,245 @@ +--- +Language: Cpp +# BasedOnStyle: WebKit +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +AlignArrayOfStructures: None +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveShortCaseStatements: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCaseColons: false +AlignEscapedNewlines: Right +AlignOperands: DontAlign +AlignTrailingComments: + Kind: Never + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Empty +AllowShortCaseLabelsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: true +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterExternBlock: false + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Leave +BreakAfterJavaFieldAnnotations: false +BreakArrays: true +BreakBeforeBinaryOperators: All +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: WebKit +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeColon +BreakStringLiterals: true +ColumnLimit: 0 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: false +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: false +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +KeepEmptyLinesAtEOF: false +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: Inner +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true +PackConstructorInitializers: BinPack +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Left +PPIndentWidth: -1 +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: true +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE +... From 66c5d8295effe988baf7a8be2aae9d6122489bf8 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sat, 29 Nov 2025 18:39:31 +0300 Subject: [PATCH 2/9] Add header for binlib --- src/binary_representation/binlib.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/binary_representation/binlib.h diff --git a/src/binary_representation/binlib.h b/src/binary_representation/binlib.h new file mode 100644 index 0000000..0570ccb --- /dev/null +++ b/src/binary_representation/binlib.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +/* +Returns pointer on string with "binary" representation of int. +Uses int32_t from . +*/ +char* decimalToBinary(int32_t decimal); + +/* +Returns pointer on string with "binary" representation of sum of two +strings with "binary" representation of int. If integers in sum reaches the limit, +sum may be incorrect. +*/ +char* binarySum(char* binaryFirst, char* binarySecond); + +/* +Returns decimal representation of "binary" representation of int. +Don`t frees "binary" representation memory. +*/ +int32_t binaryToDecimal(char* binary); + +/* +Prints "binary" representation of int. +*/ +void binaryPrint(char* binary); From fe328c2d0e2fc241c180a9456f0781eac381c59f Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sat, 29 Nov 2025 18:40:00 +0300 Subject: [PATCH 3/9] Add realization for binlib --- src/binary_representation/binlib.c | 97 ++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/binary_representation/binlib.c diff --git a/src/binary_representation/binlib.c b/src/binary_representation/binlib.c new file mode 100644 index 0000000..2d2bac4 --- /dev/null +++ b/src/binary_representation/binlib.c @@ -0,0 +1,97 @@ +#include "binlib.h" + +#include +#include +#include +#include + +char* decimalToBinary(int32_t decimal) +{ + char* binary = malloc(32 * sizeof(char)); + + for (int i = 0; i < 32; ++i) { + // Берём по биту, начиная с наименьшего разряда. + if ((1 << i) & decimal) { + binary[31 - i] = '1'; + } else { + binary[31 - i] = '0'; + } + } + + return binary; +} + +char* binarySum(char* binaryFirst, char* binarySecond) +{ + char* sum = malloc(32 * sizeof(char)); + + // Берём каждый три чиселка, два из текущего разряда чисел и третье - остаток от предыдущего сложения. + int fromPrevious = 0; + for (int i = 31; i >= 0; --i) { + int fromFirst = binaryFirst[i] == '1' ? 1 : 0; + int fromSecond = binarySecond[i] == '1' ? 1 : 0; + + switch (fromPrevious + fromFirst + fromSecond) { + case 0: + sum[i] = '0'; + fromPrevious = 0; + break; + case 1: + sum[i] = '1'; + fromPrevious = 0; + break; + case 2: + sum[i] = '0'; + fromPrevious = 1; + break; + case 3: + sum[i] = '1'; + fromPrevious = 1; + break; + } + } + + return sum; +} + +int32_t binaryToDecimal(char* binary) +{ + int32_t decimal = 0; + + // Переменная, которая показывает, что мы в данном случае считаем за непустой разряд. + char forOne = '1'; + if (binary[0] == '1') { + forOne = '0'; + } + + for (int i = 1; i < 32; ++i) { + if (binary[i] == forOne) { + // Прибавляем к десятичной форме двойку в нужной степени. + decimal += (1 << (32 - i - 1)); + } + } + + // Если число было отрицательным, то нужно прибавить 1 и умножить на -1 для правильного результата перевода из дополнительного кода. + if (binary[0] == '1') { + ++decimal; + decimal *= -1; + } + + return decimal; +} + +void binaryPrint(char* binary) +{ + // Ищем, где кончаются лидирующие нули и их не выводим. Если число 0, то выведется 0. + int firstOneIndex = 31; + for (int i = 0; i < 32; ++i) { + if (binary[i] == '1') { + firstOneIndex = i; + break; + } + } + for (int i = firstOneIndex; i < 32; ++i) { + printf("%c", binary[i]); + } + printf("\n"); +} From 1d1fcfa052fba8dc8cb8901e4c6bfc1149c92851 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sat, 29 Nov 2025 18:40:33 +0300 Subject: [PATCH 4/9] Add main file for binary representation homework --- src/binary_representation/main.c | 64 ++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/binary_representation/main.c diff --git a/src/binary_representation/main.c b/src/binary_representation/main.c new file mode 100644 index 0000000..1297458 --- /dev/null +++ b/src/binary_representation/main.c @@ -0,0 +1,64 @@ +#include "binlib.h" +#include +#include +#include +#include +#include + +void test() +{ + char* zero = decimalToBinary(0); + assert(!strcmp(zero, "00000000000000000000000000000000") && "Zero test is not passed."); + + char* one = decimalToBinary(1); + assert(!strcmp(one, "00000000000000000000000000000001") && "One test is not passed."); + char* minusOne = decimalToBinary(-1); + assert(!strcmp(minusOne, "11111111111111111111111111111111") && "Minus one test is not passed."); + + char* sum = binarySum(one, minusOne); + assert(!strcmp(sum, "00000000000000000000000000000000") && "Sum test is not passed."); + + assert(binaryToDecimal(zero) == 0 && "Zero binary to decimal test is not passed"); + assert(binaryToDecimal(one) == 1 && "Positive binary to decimal test is not passed."); + assert(binaryToDecimal(minusOne) == -1 && "Negative binary to decimal test is not passed."); + + free(zero); + free(one); + free(minusOne); + free(sum); +} + +int main(int argc, char* argv[]) +{ + if (argc > 1) { + if (strcmp(argv[1], "--test") == 0) { + test(); + printf("All tests has successfully passed.\n"); + } + } + int32_t a = 0; + int32_t b = 0; + printf("Enter two integers after space: "); + scanf("%d %d", &a, &b); + + char* aBinary = decimalToBinary(a); + char* bBinary = decimalToBinary(b); + + printf("Binary representation of integers:\n"); + binaryPrint(aBinary); + binaryPrint(bBinary); + + char* sumBinary = binarySum(aBinary, bBinary); + printf("Binary sum of integers (If integers goes beyond the limit, result may be incorrect):\n"); + binaryPrint(sumBinary); + + int32_t aDecimal = binaryToDecimal(aBinary); + int32_t bDecimal = binaryToDecimal(bBinary); + int32_t sumDecimal = aDecimal + bDecimal; + + printf("Decimal sum of integers (If integers goes beyond the limit, result may be incorrect):\n%d\n", sumDecimal); + + free(aBinary); + free(bBinary); + return 0; +} From c3cd06e75e287a2d6e53a6b5bf1e528a4f3925bb Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sat, 29 Nov 2025 18:41:12 +0300 Subject: [PATCH 5/9] Add CMakeLists.txt for build binary representation --- CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0f533f5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.25) +project(binary_representation C) + +add_library(binlib src/binary_representation/binlib.c) + +add_executable(binary_representation src/binary_representation/main.c) +target_link_libraries(binary_representation PRIVATE binlib) +target_compile_options(binary_representation PRIVATE -Wall -Wextra -pedantic) From e68ab4fd52586a608777ea9e527eda5ecd70eaa4 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sat, 29 Nov 2025 18:41:43 +0300 Subject: [PATCH 6/9] Add build directory in gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index b48d248..b1e499b 100644 --- a/.gitignore +++ b/.gitignore @@ -55,4 +55,7 @@ Module.symvers Mkfile.old dkms.conf +# CMake +build + # End of https://www.toptal.com/developers/gitignore/api/c From 443dcc5bcac55109ffffe67101d15e765409c771 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sat, 29 Nov 2025 18:42:05 +0300 Subject: [PATCH 7/9] Add build instructions --- src/binary_representation/build_instruction.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/binary_representation/build_instruction.md diff --git a/src/binary_representation/build_instruction.md b/src/binary_representation/build_instruction.md new file mode 100644 index 0000000..1503660 --- /dev/null +++ b/src/binary_representation/build_instruction.md @@ -0,0 +1,3 @@ +# Инструкция по сборке: +cmake . -B build\ +cmake --build build From 5d024377989181aa4d47ae8da2fb53e551e3ff06 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sat, 29 Nov 2025 19:20:57 +0300 Subject: [PATCH 8/9] Add build-and-lint.yml because i am forget pull clang_format branch --- .github/workflows/build-and-lint.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/build-and-lint.yml diff --git a/.github/workflows/build-and-lint.yml b/.github/workflows/build-and-lint.yml new file mode 100644 index 0000000..de3a875 --- /dev/null +++ b/.github/workflows/build-and-lint.yml @@ -0,0 +1,14 @@ +name: Build and lint + +on: + - push + - pull_request + +jobs: + check-format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - name: Check format + run: | + find . -path ./build -prune -o -type f -name '*.[c|h]' -print | xargs clang-format-18 --style=file --dry-run -Werror From a85f0d6595a98b25353b9dff701138285cac8504 Mon Sep 17 00:00:00 2001 From: Nicholay Shestakov Date: Sat, 29 Nov 2025 19:22:18 +0300 Subject: [PATCH 9/9] Add dependabot.yml because i am forget to pull clang_format branch --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..58865cf --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: "weekly"