Битовая маска в C

Вы можете следовать этому альтернативному подходу. Я считаю, что немного проще обрабатывать перенаправления.

server {
    listen 80;
    #listen [::]:80 ipv6only=on;

    server_name your.server.com;
    access_log /etc/nginx/access.log;

    root /var/www/html/someroot;

    location / {
            #autoindex on;

            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            # try_files $uri =404;

            #proxy_set_header X-Real-IP $remote_addr;
            #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #proxy_set_header Host $http_host;
            #proxy_set_header X-NginX-Proxy true;
            #proxy_pass http://127.0.0.1:8080/;
            #proxy_redirect off;
            #proxy_http_version 1.1;
            #proxy_set_header Upgrade $http_upgrade;
            #proxy_set_header Connection "upgrade";

            #proxy_redirect off;
            #proxy_set_header   X-Forwarded-Proto $scheme;
            #proxy_cache one;
            #proxy_cache_key sfs$request_uri$scheme;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/some/fullchain.pem;
    # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/some/privkey.pem; 
    # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }
}

Обратите внимание на последнее условие if. Вот где происходит все перенаправление. По сути, вы используете только один блок сервера и слушаете весь трафик, который проходит через порты 80 и 443. Когда кто-то подключается к порту 80, запрос перенаправляется на 443. У меня хорошо работает. Дайте мне знать, если это подходит и вам.

22
задан Robert Gamble 25 November 2008 в 06:38
поделиться

3 ответа

~ (~0 < < m) < < n

41
ответ дан 29 November 2019 в 03:31
поделиться

Так, Вы просите биты набора m, снабженные префиксом битами сброса k и сопровождаемые битами сброса n? Мы можем проигнорировать k, так как он будет в основном ограничен выбором целого типа.

mask = ((1 << m) - 1) << n;
29
ответ дан 29 November 2019 в 03:31
поделиться

Мне нравятся оба решения. Вот еще один способ, который приходит мне в голову (вероятно, не лучше).

((~((unsigned int)0) << k) >> (k + n)) << n

РЕДАКТИРОВАТЬ: была ошибка в моей предыдущей версии (это было без целого числа без знака). Проблема заключалась в том, что ~0 >> n добавляет 1 с фронта, а не 0.

И да, у этого подхода есть один большой недостаток; он предполагает, что вы знаете число бит целочисленного типа по умолчанию, или другими словами, он предполагает, что вы действительно знаете k, тогда как другие решения не зависят от k. Это делает мою версию менее переносимой или, по крайней мере, труднее переносить. (Он также использует 3 смены, а также сложение и побитовый оператор отрицания, что является двумя дополнительными операциями.)

Поэтому вам лучше использовать один из других примеров.

Вот небольшое тестовое приложение, созданное Джонатаном Леффлером для сравнения и проверки результатов различных решений:

#include <stdio.h>
#include <limits.h>

enum { ULONG_BITS = (sizeof(unsigned long) * CHAR_BIT) };

static unsigned long set_mask_1(int k, int m, int n)
{
    return ~(~0 << m) << n;
}

static unsigned long set_mask_2(int k, int m, int n)
{
    return ((1 << m) - 1) << n;
}

static unsigned long set_mask_3(int k, int m, int n)
{
    return ((~((unsigned long)0) << k) >> (k + n)) << n;
}

static int test_cases[][2] =
{
    { 1, 0 },
    { 1, 1 },
    { 1, 2 },
    { 1, 3 },
    { 2, 1 },
    { 2, 2 },
    { 2, 3 },
    { 3, 4 },
    { 3, 5 },
};

int main(void)
{
    size_t i;
    for (i = 0; i < 9; i++)
    {
        int m = test_cases[i][0];
        int n = test_cases[i][1];
        int k = ULONG_BITS - (m + n);
        printf("%d/%d/%d = 0x%08lX = 0x%08lX = 0x%08lX\n", k, m, n,
               set_mask_1(k, m, n),
               set_mask_2(k, m, n),
               set_mask_3(k, m, n));
    }
    return 0;
}
5
ответ дан 29 November 2019 в 03:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: